Fungsi yang ditentukan pengguna (UDF) di Unity Catalog
Penting
Fitur ini ada di Pratinjau Publik.
Azure Databricks menyediakan sintaksis asli SQL untuk mendaftarkan fungsi kustom ke skema yang diatur oleh Unity Catalog. UDF Python yang terdaftar sebagai fungsi dalam Unity Catalog berbeda dalam cakupan dan dukungan dari UDF PySpark yang tercakup ke notebook atau SparkSession. Lihat Fungsi skalar yang ditentukan pengguna - Python.
Untuk referensi bahasa SQL lengkap, lihat CREATE FUNCTION (SQL dan Python).
Untuk informasi tentang cara Katalog Unity mengelola izin pada fungsi, lihat CREATE FUNCTION.
Persyaratan
- Databricks Runtime 13.3 LTS atau lebih tinggi.
- Untuk menggunakan kode Python di UDF yang terdaftar di Unity Catalog, Anda harus menggunakan gudang SQL tanpa server atau pro atau kluster yang menjalankan Databricks Runtime 13.3 LTS atau lebih tinggi.
- Untuk mengatasi tampilan yang dibuat menggunakan UDF yang terdaftar ke Unity Catalog, Anda harus menggunakan gudang SQL tanpa server atau pro.
Fungsi SQL kustom di Unity Catalog
Saat Anda membuat fungsi SQL menggunakan komputasi yang dikonfigurasi untuk Unity Catalog, fungsi didaftarkan ke skema aktif saat ini secara default. Contoh berikut menunjukkan sintaks yang mungkin Anda gunakan untuk mendeklarasikan katalog target dan skema untuk fungsi baru:
CREATE FUNCTION target_catalog.target_schema.roll_dice()
RETURNS INT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
COMMENT 'Roll a single 6 sided die'
RETURN (rand() * 6)::INT + 1;
Semua pengguna dengan hak istimewa yang memadai pada fungsi kemudian dapat menggunakan fungsi di lingkungan komputasi yang dikonfigurasi untuk Katalog Unity, seperti dalam contoh berikut:
SELECT target_catalog.target_schema.roll_dice()
Catatan
Anda dapat menggunakan UDF menggunakan LANGUAGE SQL
untuk mengembalikan tabel atau nilai skalar.
Mendaftarkan UDF Python ke Katalog Unity
Dalam Databricks Runtime 13.3 LTS ke atas, Anda dapat menggunakan pernyataan SQL CREATE FUNCTION
untuk mendaftarkan UDF Python skalar ke Unity Catalog.
Penting
Jika Anda ingin menggunakan gudang SQL untuk mendaftarkan UDF Python di Katalog Unity, itu harus menjadi gudang SQL Pro atau Tanpa Server.
UDF Python dirancang untuk memberikan ekspresi penuh Python langsung dalam fungsi SQL, memungkinkan operasi yang disesuaikan seperti transformasi tingkat lanjut, masking data, dan hashing.
UDF Python dijalankan di lingkungan yang aman dan terisolasi dan tidak memiliki akses ke sistem file atau layanan internal.
Dalam Databricks Runtime 13.3 LTS hingga 14.2, UDF Python yang berjalan pada komputasi tanpa server atau dalam mode akses bersama memungkinkan lalu lintas jaringan TCP/UDP melalui port 80, 443, dan 53.
Lihat UDF mana yang paling efisien?.
Catatan
Sintaksis dan semantik untuk UDF Python di Unity Catalog berbeda dari UDF Python yang terdaftar di SparkSession. Lihat Fungsi skalar yang ditentukan pengguna - Python.
Pernyataan penggunaan Python UDFs for Unity Catalog dimatikan oleh tanda dolar ganda ($$
), seperti dalam contoh kode berikut:
CREATE FUNCTION target_catalog.target_schema.greet(s STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
return f"Hello, {s}"
$$
Contoh berikut menunjukkan penggunaan fungsi ini untuk mengembalikan pernyataan salam untuk semua nama yang disimpan dalam first_name
kolom tabel bernama students
:
SELECT target_catalog.target_schema.greet(first_name)
FROM students;
Anda dapat menentukan sejumlah fungsi Python dalam UDF Python, tetapi harus mengembalikan nilai skalar.
Fungsi Python harus menangani NULL
nilai secara independen, dan semua pemetaan jenis harus mengikuti pemetaan bahasa Azure Databricks SQL.
Anda dapat mengimpor pustaka Python standar yang disertakan oleh Azure Databricks, tetapi Anda tidak dapat menyertakan pustaka kustom atau dependensi eksternal.
Jika tidak ada katalog atau skema yang ditentukan, UDF Python terdaftar ke skema aktif saat ini.
Contoh berikut mengimpor pustaka dan menggunakan beberapa fungsi dalam UDF Python:
CREATE FUNCTION roll_dice(num_dice INTEGER, num_sides INTEGER)
RETURNS INTEGER
LANGUAGE PYTHON
AS $$
import numpy as np
def roll_die(num_sides):
return np.random.randint(num_sides) + 1
def sum_dice(num_dice,num_sides):
return sum([roll_die(num_sides) for x in range(num_dice)])
return sum_dice(num_dice, num_sides)
$$