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

Unity 目錄中的使用者定義函式 (UDF) 會擴充 Azure Databricks 內的 SQL 和 Python 功能。 它們讓你能在計算環境中定義、使用並安全地分享及管理自訂函式。

在 Unity Catalog 中註冊為函式的 Python UDF,其範圍和支援與限定於筆記本或 SparkSession 的 PySpark UDF 有所不同。 參見 Python 標量使用者定義函數(UDF)。

若要在 Unity 目錄中註冊以 Scala 或 Java 撰寫的 UDF,請參見 Unity 目錄中的 Scala 與 Java 使用者定義函式(UDF)。

若想在修改 Unity 目錄前查看哪些工作負載和資料表會參考 UDF,請參閱「檢視 UDF 血統」。

完整的 SQL 語言參考,請參見 CREATE FUNCTION (SQL、Python、Scala 和 Java)。

需求

若要在 Unity 目錄中使用 UDF,您必須符合下列需求:

  • 若要在 Unity 目錄中註冊的 UDF 中使用 Python 程式代碼,您必須使用無伺服器或 Pro SQL 倉儲,或是執行 Databricks Runtime 13.3 LTS 或更新版本之叢集。
  • 如果一個檢視包含 Unity Catalog Python UDF,則在經典 SQL 倉庫中會失敗。
  • 在支援 Unity 目錄的叢集上,支援 Scala UDF 的 ARM 實例支援,則可在 Databricks Runtime 15.2 及以上版本中提供。

標量與批次 Unity 目錄 Python UDF 通常可在所有支援的運算類型上使用。

Python UDF 功能需求

需求因功能而異。 Databricks Runtime 19 與環境版本 6 並非 Unity Catalog Python UDF 的一般要求。

對於在無伺服器筆記本或作業中執行的 PySpark 工作階段 UDF,環境需求係指工作階段環境。 對於以 SQL 定義的 Python UDF,它們會在每個函式的 environment_version 子句中參照 ENVIRONMENT。 更改會話環境不會改變現有 Unity 目錄函式的環境。 例如,使用環境版本 6 的會話可以呼叫環境版本 5 定義的 Unity 目錄函式。

Feature 需求
ENVIRONMENT 子句與慣例依賴關係 無伺服器筆記本與工作;專業版或無伺服器 SQL 倉庫;經典運算版上的 Databricks Runtime 16.2 或以上版本。 在經典運算中,Databricks 執行時 16.2 至 18.1, environment_version 必須是 'None'。
Batch Unity Catalog Python UDF 無伺服器運算;專業版與無伺服器 SQL 倉庫;經典運算上的 Databricks Runtime 16.3 或以上版本
標量 Python UDF 的具名處理常式 傳統運算支援 Databricks Runtime 18.1 或以上版本。 在無伺服器運算以及專業版和無伺服器 SQL 倉庫上,明確將 UDF environment_version 設為 6 或更高。
純量 Python UDF 中的服務憑證 傳統運算支援 Databricks Runtime 18.1 或以上版本。 在無伺服器運算以及專業版和無伺服器 SQL 倉庫上,明確將 UDF environment_version 設為 6 或更高。 經典運算不需環境版本 6。 在無伺服器 SQL 倉庫中,也啟用隔離工作負載網路公開預覽版。
Batch Unity Catalog Python UDF 中的服務憑證 無伺服器運算;專業版與無伺服器 SQL 倉庫;在經典運算上支援 Databricks Runtime 16.3 或以上版本。 環境版本 6 並非必需。 在無伺服器 SQL 倉庫中,也啟用隔離工作負載網路公開預覽版。
標量或批次 Unity Catalog Python UDF 中的機密 明確將 environment_version 設定為 6 或更高;無伺服器運算;專業版和無伺服器 SQL 倉庫;在傳統計算上使用標準存取模式的 Databricks Runtime 19 或更新版本。 專用存取模式的運算不支援直接調用。
與 PySpark 相容 TIMESTAMP 的輸入行為 傳統運算支援 Databricks Runtime 18.1 或以上版本。 在無伺服器運算以及專業版和無伺服器 SQL 倉庫上,明確將 UDF environment_version 設為 6 或更高。
查詢中有超過五次 UDF 呼叫 傳統運算支援 Databricks Runtime 18.1 或以上版本。 在無伺服器運算以及專業版和無伺服器 SQL 倉庫中,明確將每個 UDF environment_version 設定為 6 或更高。

在公開預覽階段可用的現有 UDF 與功能,仍可在適用的早期執行版本上運作。

環境版本也會決定呼叫者是否需要直接存取儲存在 Unity 目錄卷中的相依性。 請參閱 Unity 目錄卷中相依關係的權限。

經典運算上的環境版本

在經典運算中,若要設定 environment_version 為非 的 'None' 值,則需要 Databricks 執行時 18.2 或以上。 在 Databricks 執行環境 16.2 到 18.1 中,使用 environment_version = 'None' 子句時 ENVIRONMENT 設定。 該數值'None'使用預設的 Python 環境。

在 Databricks Runtime 18.2 或以上版本,為了可預測行為,Azure Databricks 建議在每個 Unity Catalog Python UDF 定義中明確設定固定environment_version值。 選擇符合 UDF 功能要求並遵循以下相容性建議的版本:

Databricks 執行環境版本 最高推薦環境版本
18.2 至 18.x 5
19.x 6

在 Unity 目錄中建立 SQL 與 Python UDF

要在 Unity 目錄中建立 SQL 或 Python UDF,使用者需要對結構(schema)和目錄(catalog)擁有 USAGE 和 CREATE 權限。 如需詳細資訊,請參閱 Unity 目錄。

若要執行 UDF,使用者需要 UDF 的 EXECUTE 許可權。 使用者也需要架構和目錄的 USAGE 權限。

要在 Unity 目錄結構中建立並註冊 UDF,函式名稱必須遵循格式 catalog.schema.function_name。 或者,您可以在 SQL 編輯器中選取正確的型錄和綱目。 在這種情況下,你的函式名稱前面不得加上 catalog.schema:

建立預先選取目錄和結構描述的UDF。

下列範例會將新函式註冊至 my_schema 目錄中的 my_catalog 結構描述:

CREATE OR REPLACE FUNCTION my_catalog.my_schema.calculate_bmi(weight DOUBLE, height DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
RETURN
SELECT weight / (height * height);

Unity Catalog 的 Python UDF 使用以雙美元符號($$)界定的陳述式。 您必須指定資料類型對應。 下列範例會註冊一個用於計算身體質量指數的 UDF(使用者定義函數):

CREATE OR REPLACE FUNCTION my_catalog.my_schema.calculate_bmi(weight_kg DOUBLE, height_m DOUBLE)
RETURNS DOUBLE
LANGUAGE PYTHON
AS $$
return weight_kg / (height_m ** 2)
$$;

您現在可以在 SQL 查詢或 PySpark 程式代碼中使用此 Unity 目錄函式:

SELECT person_id, my_catalog.my_schema.calculate_bmi(weight_kg, height_m) AS bmi
FROM person_data;

如需更多 UDF 範例,請參閱 列過濾器範例 及 直欄遮罩範例 。

在純量 Python UDF 中使用具名處理常式

在傳統運算上,具名處理常式需要 Databricks Runtime 18.1 或更新版本。 在無伺服器運算以及專業版和無伺服器 SQL 倉庫上,明確將 UDF environment_version 設為 6 或更高。 以下範例使用環境版本 6。 在經典運算系統中運行 Databricks Runtime 18.1,請省略該 ENVIRONMENT 子句。 在較新的執行版本中,若包含該條款,請遵循 相容性建議 。

使用HANDLER子句將 UDF 主體中的 Python 函式命名為入口點。 具名處理常式會接受 UDF 引數,並回傳符合已宣告回傳類型的值。 處理器外部的程式碼會在每個 Python 環境初始化 UDF 時執行,也就是處理器處理輸入之前。 使用此程式碼進行一次性初始化,且可在處理程序呼叫間重複使用。

以下範例在定義 greet_handler之前,先初始化greeting_prefix處理 UDF 輸入的函式:

CREATE OR REPLACE FUNCTION my_catalog.my_schema.greet(name STRING)
RETURNS STRING
LANGUAGE PYTHON
HANDLER 'greet_handler'
ENVIRONMENT (
  environment_version = '6'
)
AS $$
# Runs once when each Python environment initializes the UDF.
greeting_prefix = "Hello"

def greet_handler(name):
    return f"{greeting_prefix}, {name}!"
$$;

在 Python UDF 中使用密鑰

標量與批次 Unity Catalog Python UDF 可存取在 SECRETS 子句中宣告的祕密。 UDF 定義必須明確將 environment_version 設為 6 或更高。 Unity 目錄的秘密使用三部分名稱(catalog.schema.secret),與工作空間層級的 Azure Databricks 秘密不同。 關於計算支援、權限及專用計算欄位遮罩例外,請參見 UDF 要求與權限。

要在 UDF 中存取密鑰:

  1. 在 UDF 定義中的子句中加入秘密的三部分名稱 SECRETS 。 UDF 只能存取在此子句中宣告的密碼。
  2. 在 UDF 主體中,呼叫 databricks.secrets.get() 時會提供目錄、架構和秘密名稱。

以下純量 UDF 範例使用 Unity Catalog 密鑰作為雜湊式訊息驗證碼(HMAC)的簽章金鑰。 使用相同的 SECRETS 子句搭配 PARAMETER STYLE PANDAS,以存取在 Batch UDF 處理常式中宣告的密鑰。

CREATE OR REPLACE FUNCTION main.default.sign_value(value STRING)
RETURNS STRING
LANGUAGE PYTHON
SECRETS (main.default.hmac_key)
ENVIRONMENT (
  environment_version = '6'
)
AS $$
import hashlib
import hmac
from databricks.secrets import get

key = get(catalog="main", schema="default", key="hmac_key")
return hmac.new(key.encode(), value.encode(), hashlib.sha256).hexdigest()
$$;

Warning

請勿從 UDF 回傳機密值。 秘密塗黑有助於減少錯誤與日誌中的意外暴露,但並不能阻止 UDF 程式碼在查詢結果中揭露機密內容。

使用自定義相依性擴充UDF

注意

若要在無伺服器 SQL 倉儲中從網際網路安裝自訂相依性,您的工作區必須在 預覽 頁面啟用公開預覽功能 為無伺服器 SQL 倉儲中的隔離工作負載啟用網路。

你可以透過定義外部函式庫的自訂相依關係,將 Unity Catalog Python UDF 的功能擴展到超過 Databricks 執行環境之外。

需求規格

下列計算類型支援 Unity 目錄 UDF 的自訂相依性:

  • 無伺服器筆記本和任務
  • 經典多功能計算,使用 Databricks 執行時版本 16.2 及以上
  • 專業版或無伺服器 SQL 倉儲

依賴來源

從下列來源安裝相依性:

  • PyPI 套件
  • 儲存在 Unity 目錄卷中的檔案 請參閱 Unity 目錄卷中相依關係的權限。
  • 可在公用 URL 取得的檔案 您的工作區網路安全性規則必須允許存取公用 URL。 請參閱 需求。

注意

如果你的工作區限制了無伺服器網路存取,你必須設定網路安全規則來允許公開網址。 請參見 「Set Egress rules」。

Unity Catalog 磁碟區中相依物件的權限

函式建立者必須在來源磁碟區建立 READ VOLUME ,才能將該磁碟區的相依性加入 UDF。

對於定義中明確將 environment_version 設為 6 或更高的 UDF,呼叫端需要具備對 UDF 的 EXECUTE,但不需要具備對來源磁碟區的 READ VOLUME。 若 UDF 定義省略 environment_version、將其設為 None,或設為較早的版本,呼叫端也必須在來源磁碟區上具有 READ VOLUME。

定義相依關係

UDF 定義的ENVIRONMENT區段用來指定相依性。

CREATE OR REPLACE FUNCTION my_catalog.my_schema.mixed_process(data STRING)
RETURNS STRING
LANGUAGE PYTHON
ENVIRONMENT (
  dependencies = '["simplejson==3.19.3", "/Volumes/my_catalog/my_schema/my_volume/packages/custom_package-1.0.0.whl", "https://my-bucket.s3.amazonaws.com/packages/special_package-2.0.0.whl?Expires=2043167927&Signature=abcd"]',
  environment_version = '6'
)
AS $$
import simplejson as json
import custom_package
return json.dumps(custom_package.process(data))
$$;

區 ENVIRONMENT 段包含下列欄位:

領域 說明 類型 範例使用方式
dependencies 要安裝的逗號分隔相依組件列表。 每個條目都是符合 pip 需求檔案格式的字串。 STRING dependencies = '["simplejson==3.19.3", "/Volumes/catalog/schema/volume/packages/my_package-1.0.0.whl"]'
dependencies = '["https://my-bucket.s3.amazonaws.com/packages/my_package-2.0.0.whl?Expires=2043167927&Signature=abcd"]'
environment_version 指定執行 UDF 的環境版本。 只要 ENVIRONMENT 子句存在,此欄位即為必要。 固定環境版本會以特定 Python 版本及一組預裝套件執行 UDF,獨立於底層 Databricks 執行環境中的 Python 版本及套件。
支援的值為環境版本為 3 或以上,例如 '6',或字串 'None'。 該值'None'選擇預設的 Python 環境。 在經典運算中,若要設定 environment_version 為非 的 'None' 值,則需要 Databricks 執行時 18.2 或以上。 在 Databricks 執行環境 16.2 至 18.1 中,僅 'None' 支援 當支援固定的環境版本時,請明確選取其中一個,以確保行為可預測。
在無伺服器運算以及專業與無伺服器 SQL 倉庫中,有些功能需要明確的環境版本。 在每個 UDF 定義中設定 environment_version 為所需版本或更高。 省略整 ENVIRONMENT 條款或設定 environment_version = 'None' 並不會啟用這些功能。 請參見 Python UDF 功能要求。
關於經典計算版本相容性,請參見 經典計算環境版本。 有關可用版本列表,請參見 環境版本。
STRING environment_version = '6'

在 PySpark 中使用 Unity Catalog 的 UDF

from pyspark.sql.functions import expr

result = df.withColumn("bmi", expr("my_catalog.my_schema.calculate_bmi(weight_kg, height_m)"))
display(result)

升級會話範圍的 UDF

注意

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

在 Azure Databricks 筆記本中給定下列會話型 UDF:

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

@udf(StringType())
def greet(name):
    return f"Hello, {name}!"

# Using the session-based UDF
result = df.withColumn("greeting", greet("name"))
result.show()

若要將此註冊為 Unity Catalog 函式,請使用 SQL CREATE FUNCTION 語句,如下列範例所示:

CREATE OR REPLACE FUNCTION my_catalog.my_schema.greet(name STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
return f"Hello, {name}!"
$$

在 Unity 資料目錄中共用使用者定義函數 (UDF)

你註冊 UDF 的目錄、結構描述或資料庫上所套用的存取控制,會管理該 UDF 的權限。 如需詳細資訊,請參閱 在 Unity 目錄中管理許可權 。

使用 Azure Databricks SQL 或 Azure Databricks 工作區 UI 來授與使用者或群組的許可權(建議)。

工作區 UI 中的許可權

  1. 尋找儲存 UDF 的目錄和架構,然後選取 UDF。
  2. 在 UDF 設定中尋找 [許可權] 選項。 新增使用者或群組,並指定他們必須擁有的存取類型,例如 EXECUTE 或 MANAGE。

工作區介面中的 許可權

使用 Azure Databricks SQL 的許可權

下列範例賦予使用者 EXECUTE 函式許可權:

GRANT EXECUTE ON FUNCTION my_catalog.my_schema.calculate_bmi TO `user@example.com`;

若要移除許可權,請使用 REVOKE 命令,如下列範例所示:

REVOKE EXECUTE ON FUNCTION my_catalog.my_schema.calculate_bmi FROM `user@example.com`;

環境隔離

注意

共享隔離環境需要 Databricks Runtime 18.1 及以上版本。 在早期版本中,所有 Unity Catalog Python UDF 皆以嚴格隔離模式運行。

如果 Unity Catalog Python UDF 具有相同的擁有者和會話,預設情況下可以共享隔離環境。 這不僅提升效能,也減少了需要啟動的獨立環境數量,從而減少記憶體使用。

嚴格隔離

為了驗證 UDF 總是在其完全隔離的環境中執行,請加入 STRICT ISOLATION 特徵子句。

大部分的 UDF 不需要嚴格的隔離。 標準數據處理 UDF 受益於預設的共用隔離環境,並以較低的記憶體耗用量更快執行。

將 STRICT ISOLATION 特性子句新增至 UDF,以便:

  • 以代碼形式運行輸入,使用eval()、exec()或類似函數。
  • 將檔案寫入本機檔案系統。
  • 修改全域變數或系統狀態。
  • 存取或修改環境變數。

以下程式碼展示了必須使用 STRICT ISOLATIONRun 的 UDF 範例。 此 UDF 執行任意 Python 程式碼,因此可能會改變系統狀態、存取環境變數,或寫入本地檔案系統。 使用此 STRICT ISOLATION 條款有助於防止 UDF 間的干擾或資料外洩。

CREATE OR REPLACE TEMPORARY FUNCTION run_python_snippet(python_code STRING)
RETURNS STRING
LANGUAGE PYTHON
STRICT ISOLATION
AS $$
import sys
from io import StringIO

# Capture standard output and error streams
captured_output = StringIO()
captured_errors = StringIO()
sys.stdout = captured_output
sys.stderr = captured_errors

try:
    # Execute the user-provided Python code in an empty namespace
    exec(python_code, {})
except SyntaxError:
    # Retry with escaped characters decoded (for cases like "\n")
    def decode_code(raw_code):
        return raw_code.encode('utf-8').decode('unicode_escape')
    python_code = decode_code(python_code)
    exec(python_code, {})

# Return everything printed to stdout and stderr
return captured_output.getvalue() + captured_errors.getvalue()
$$

設定 DETERMINISTIC 以確保您的函數產生一致的結果

如果函數定義對相同的輸入產生相同的輸出,則在您的函數定義中新增 DETERMINISTIC。 這允許查詢優化以提高效能。

預設情況下,Azure Databricks 會將 Batch Unity Catalog 的 Python UDF 視為非確定性,除非你明確聲明。 非確定性函數的範例包括產生隨機值、存取目前時間或日期,或進行外部 API 呼叫。

參見CREATE FUNCTION(SQL、Python、Scala 和 Java)

供代理程式工具使用的 UDF

AI 代理可以使用 Unity Catalog 的 UDF 作為執行任務和執行自訂邏輯的工具。

請參閱 使用 Unity 目錄函式建立代理工具。

用於存取外部 API 的 UDF

您可以使用 UDF 從 SQL 存取外部 API。 下列範例會使用 Python requests 連結庫提出 HTTP 要求。

注意

Python UDF 允許在使用無伺服器運算或設定為標準存取模式的運算模式時,透過 80、443 和 53 埠進行 TCP/UDP 網路流量。

CREATE FUNCTION my_catalog.my_schema.get_food_calories(food_name STRING)
RETURNS DOUBLE
LANGUAGE PYTHON
AS $$
import requests

api_url = f"https://example-food-api.com/nutrition?food={food_name}"
response = requests.get(api_url)

if response.status_code == 200:
   data = response.json()
   # Assume the API returns a JSON object with a 'calories' field
   calories = data.get('calories', 0)
   return calories
else:
   return None  # API request failed

$$;

用於安全性與合規性的使用者定義函數 (UDF)

使用 Python UDF 來實作自定義令牌化、數據遮罩、數據修訂或加密機制。

下列範例會遮罩電子郵件位址的身分識別,同時維持長度和網域:

CREATE OR REPLACE FUNCTION my_catalog.my_schema.mask_email(email STRING)
RETURNS STRING
LANGUAGE PYTHON
DETERMINISTIC
AS $$
parts = email.split('@', 1)
if len(parts) == 2:
  username, domain = parts
else:
  return None
masked_username = username[0] + '*' * (len(username) - 2) + username[-1]
return f"{masked_username}@{domain}"
$$

下列範例會在動態檢視定義中套用此 UDF:

-- First, create the view
CREATE OR REPLACE VIEW my_catalog.my_schema.masked_customer_view AS
SELECT
  id,
  name,
  my_catalog.my_schema.mask_email(email) AS masked_email
FROM my_catalog.my_schema.customer_data;

-- Now you can query the view
SELECT * FROM my_catalog.my_schema.masked_customer_view;
+---+------------+------------------------+------------------------+
| id|        name|                   email|           masked_email |
+---+------------+------------------------+------------------------+
|  1|    John Doe|   john.doe@example.com |  j*******e@example.com |
|  2| Alice Smith|alice.smith@company.com |a**********h@company.com|
|  3|   Bob Jones|    bob.jones@email.org |   b********s@email.org |
+---+------------+------------------------+------------------------+

最佳做法

若要讓所有使用者都能存取UDF,Databricks建議使用適當的訪問控制建立專用目錄和架構。

對於團隊特定的 UDF,請使用團隊目錄內的專用結構描述進行儲存和管理。

Databricks 建議您在 UDF 文件字串中包含下列資訊:

  • 目前的版本號碼
  • 用來追蹤跨版本修改的變更日誌
  • UDF 用途、參數及傳回值
  • 如何使用UDF的範例

以下範例展示了遵循最佳實務的 UDF:

CREATE OR REPLACE FUNCTION my_catalog.my_schema.calculate_bmi(weight_kg DOUBLE, height_m DOUBLE)
RETURNS DOUBLE
COMMENT "Calculates Body Mass Index (BMI) from weight and height."
LANGUAGE PYTHON
DETERMINISTIC
AS $$
 """
Parameters:
calculate_bmi (version 1.2):
- weight_kg (float): Weight of the individual in kilograms.
- height_m (float): Height of the individual in meters.

Returns:
- float: The calculated BMI.

Example Usage:

SELECT calculate_bmi(weight, height) AS bmi FROM person_data;

Change Log:
- 1.0: Initial version.
- 1.1: Improved error handling for zero or negative height values.
- 1.2: Optimized calculation for performance.

 Note: BMI is calculated as weight in kilograms divided by the square of height in meters.
 """
if height_m <= 0:
 return None  # Avoid division by zero and ensure height is positive
return weight_kg / (height_m ** 2)
$$;

逐列輸入的時間戳記時區行為

TIMESTAMP 輸入到達逐列處理的 Python UDF 時,會是 UTC 的不含時區資訊 datetime 值。 在傳統運算環境中,此行為需要 Databricks Runtime 18.1 或更新版本。 在無伺服器運算以及專業版和無伺服器 SQL 倉庫上,明確將 UDF environment_version 設為 6 或更高。 該 datetime 物件的屬性中不包含時區元資料 tzinfo 。

批次 Unity Catalog Python UDF 會以 pandas.Series 物件形式接收時間戳記輸入,且不使用此 datetime 對應。

此變更使 Unity Catalog 的 Python UDF 與 Apache Spark 中 Arrow 優化的 Python UDF 對齊。

例如,以下查詢明確將環境版本 6 及會話時區設定為 UTC:

SET TIME ZONE 'UTC';

CREATE FUNCTION timezone_udf(date TIMESTAMP)
RETURNS STRING
LANGUAGE PYTHON
ENVIRONMENT (
  environment_version = '6'
)
AS $$
return f"{type(date)} {date} {date.tzinfo}"
$$;

SELECT timezone_udf(TIMESTAMP '2024-10-23 10:30:00');

先前的執行路徑會在會話時區回傳一個時區感知值。 此規定適用於 Databricks 執行 18.1 之前的經典運算。 這也適用於無伺服器運算,以及 Pro 和無伺服器 SQL 倉儲:當您省略 ENVIRONMENT 子句、設定 environment_version = 'None',或選取早於 6 的版本時。 當會話時區設為 UTC 時,較早的路徑會產生:

<class 'datetime.datetime'> 2024-10-23 10:30:00+00:00 UTC

根據上述定義,無伺服器運算以及專業與無伺服器 SQL 倉庫都採用相容 PySpark 的行為。 執行 Databricks Runtime 18.1 或以上版本的傳統運算,在您調整或省略 ENVIRONMENT 子句時,也會採用相同的行為:

<class 'datetime.datetime'> 2024-10-23 10:30:00 None

此變更也可能影響時鐘欄位以及 tzinfo。 對於即時 2024-10-23T10:30:00Z,在 America/Los_Angeles 工作階段中較早的行為會產生 2024-10-23 03:30:00-07:00。 此新行為會產生不含時區資訊的 UTC 值 2024-10-23 10:30:00。

如果你的 UDF 依賴時區資訊,請明確還原 UTC:

from datetime import timezone

date = date.replace(tzinfo=timezone.utc)

新增 UTC 時區資訊並不會恢復先前的會話本地時鐘欄位。 如果你的邏輯需要這些欄位,也要把 aware 值轉換成預期的會話時區。 例如:

from zoneinfo import ZoneInfo

date = date.astimezone(ZoneInfo("America/Los_Angeles"))

限制

  • 您可以在 Python UDF 中定義任意數目的 Python 函式,但所有函式都必須傳回純量值。
  • Python 函式必須獨立處理 NULL 值,而且所有類型對應都必須遵循 Azure Databricks SQL 語言對應。
  • 如果你沒有指定目錄或架構,Azure Databricks 會將 Python UDF 註冊到目前的活躍結構。
  • Python UDF 運行於安全且隔離的環境中,無法存取檔案系統或內部服務。
  • 在運行 Databricks Runtime 18.1 或更高版本的經典運算中,查詢時可以呼叫超過 5 個 UDF。 在無伺服器運算以及專業與無伺服器 SQL 倉庫中,每個 UDF 定義都必須明確設定 environment_version 為 6 或更高。