Share via


Unity 目錄中的使用者定義函式 (UDF)

重要

這項功能處於公開預覽狀態

Azure Databricks 提供 SQL 原生語法,以向 Unity 目錄所控管的架構註冊自定義函式。 在 Unity 目錄中註冊為函式的 Python UDF 在範圍與 PySpark UDF 的範圍和支援不同之處在於筆記本或 SparkSession。 請參閱 使用者定義的純量函式 - Python

如需完整的 SQL 語言參考,請參閱 CREATE FUNCTION(SQL 和 Python)。

如需 Unity 目錄如何管理函式許可權的資訊,請參閱 CREATE FUNCTION

需求

  • Databricks Runtime 13.3 LTS 或更新版本。
  • 若要在 Unity 目錄中註冊的 UDF 中使用 Python 程式代碼,您必須使用無伺服器或 Pro SQL 倉儲,或是執行 Databricks Runtime 13.3 LTS 或更新版本之叢集。
  • 若要解析使用已註冊至 Unity 目錄的 UDF 所建立的檢視,您必須使用無伺服器或 Pro SQL 倉儲。

Unity 目錄中的自訂 SQL 函式

當您使用針對 Unity 目錄設定的計算來建立 SQL 函式時,函式預設會註冊到目前作用中的架構。 下列範例示範您可用來宣告新函式的目標目錄和架構的語法:

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;

在函式上具有足夠許可權的所有使用者,接著可以在針對 Unity 目錄設定的計算環境中使用 函式,如下列範例所示:

SELECT target_catalog.target_schema.roll_dice()

注意

您可以使用的 LANGUAGE SQL UDF 來傳回資料表或純量值。

向 Unity 目錄註冊 Python UDF

在 Databricks Runtime 13.3 LTS 和更新版本中,您可以使用 SQL CREATE FUNCTION 語句向 Unity 目錄註冊純量 Python UDF。

重要

只有 Pro 和無伺服器 SQL 倉儲支援適用於 Unity 目錄的 Python UDF。

Python UDF 的設計目的是在 SQL 函式中直接提供 Python 的完整表達性,允許自定義作業,例如進階轉換、數據遮罩和哈希。

Python UDF 會在安全、隔離的環境中執行,而且無法存取檔系統或內部服務。

在無伺服器計算或共用存取模式上執行的 Python UDF 允許透過埠 80、443 和 53 的 TCP/UDP 網路流量。

請參閱 哪些 UDF 最有效率?

注意

Unity 目錄中 Python UDF 的語法和語意與向 SparkSession 註冊的 Python UDF 不同。 請參閱 使用者定義的純量函式 - Python

Python 適用於 Unity 目錄的 UDF 使用語句是以雙元符號設定的 ,$$如下列程式代碼範例所示:

CREATE FUNCTION target_catalog.target_schema.greet(s STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
  return f"Hello, {s}"
$$

下列範例示範如何使用這個函式傳回儲存在數據表students數據行中first_name之所有名稱的問候語句:

SELECT target_catalog.target_schema.greet(first_name)
FROM students;

您可以在 Python UDF 中定義任意數目的 Python 函式,但必須傳回純量值。

Python 函式必須獨立處理 NULL 值,而且所有類型對應都必須遵循 Azure Databricks SQL 語言對應

您可以匯入 Azure Databricks 隨附的標準 Python 連結庫,但不能包含自定義連結庫或外部相依性。

如果未指定任何目錄或架構,Python UDF 就會註冊到目前的使用中架構。

下列範例會匯入連結庫,並在 Python UDF 內使用多個函式:

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