Bagikan melalui


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

Hanya gudang SQL pro dan tanpa server yang mendukung UDF Python untuk Katalog Unity.

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)
$$