CREATE FUNCTION(SQL、Python、Scala 與 Java)

適用於:核取記號為「是」Databricks SQL 核取記號為「是」Databricks Runtime

建立採用一組自變數並傳回純量值或一組數據列的SQL純量或數據表函式。

適用於:勾選是 Databricks SQL 勾選是 Databricks Runtime 13.3 LTS 和更新版本

建立 Python 純量函式,以接受一組自變數並傳回純量值。

Python UDF 需要無伺服器或 Pro SQL 倉儲上的 Unity 目錄,或已啟用 Unity 目錄的計算資源。

適用於:核取記號為「是」 Databricks SQL 核取記號為「是」 Databricks Runtime 14.1 和更新版本

除了位置參數調用之外,您也可以使用具名參數調用來叫用 SQL 和 Python UDF。

適用於:勾選為 yes Databricks SQL 勾選為 yes Databricks Runtime 16.2 及以上版本

使用子 ENVIRONMENT 句安裝自訂相依關係,並設定宣告為函 LANGUAGE PYTHON式的環境版本。 在經典運算中,其他 environment_version 必須 'None' 支援 Databricks 執行時 18.2 或以上。

適用於:已勾選為是 Databricks SQL 已勾選為是 Databricks Runtime 16.3 和以上版本

使用 PARAMETER STYLE PANDAS 子 HANDLER 句來定義批次 LANGUAGE PYTHON 函數。 處理器將輸入資料視為物件的 pandas.Series 迭代器,並產生 pandas.Series 物件作為輸出。

適用於:勾選標記為是 Databricks SQL 勾選標記為是 Databricks 執行環境 18.1 及以上版本

使用帶有列列純量LANGUAGE PYTHON函式的HANDLER子句來命名處理 UDF 輸入的 Python 函式。 在無伺服器運算以及專業版和無伺服器 SQL 倉庫上,明確將 UDF environment_version 設為 6 或更高。

適用於:已勾選為是 Databricks SQL 已勾選為是 Databricks Runtime 16.3 和以上版本

使用該 CREDENTIALS 子句宣告批次或列 LANGUAGE PYTHON 逐列標量函式存取的 Unity 目錄服務憑證。 請參閱「在 Python UDF 中使用服務憑證」,了解函式類型、運算、環境及網路需求。

適用於:勾選標記為是 Databricks SQL 勾選為 Databricks 執行時間 19 及以上

使用該 SECRETS 子句來宣告 Unity 目錄的機密,這些機密是標量、批次 LANGUAGE PYTHON 函式或標量 LANGUAGE SCALA 函式所存取的。 請參閱 UDF 關於 運算、環境及權限要求的要求與權限。

適用於:勾選標記為是 Databricks SQL 勾 選為 Databricks 執行時間 18.2 及以上版本

建立一個 Scala 或 Java 純量函式,執行編譯後的 JVM 邏輯,並以 JAR 格式封裝。 Scala 和 Java UDF 需要 Unity 目錄。 SQL 倉庫支援僅限於專業版和無伺服器 SQL 倉庫。 你用子句參考編譯後的程式碼 HANDLER ,並透過 ENVIRONMENT 子句的 java_dependencies 鍵提供 JAR。 完整工作流程,包括如何建置 JAR 及註冊函式,請參閱 Unity 目錄中的 Scala 與 Java 使用者定義函式(UDF)。

語法

CREATE [OR REPLACE] [TEMPORARY] FUNCTION [IF NOT EXISTS]
    function_name ( [ function_parameter [, ...] ] )
    { [ RETURNS data_type ] |
      RETURNS TABLE [ ( column_spec [, ...]) ] }
    [ characteristic [...] ]
    { AS dollar_quoted_string | HANDLER handler_name [ AS dollar_quoted_string ] | RETURN { expression | query } }

function_parameter
    parameter_name data_type [DEFAULT default_expression] [COMMENT parameter_comment]

column_spec
    column_name data_type [COMMENT column_comment]

characteristic
  { LANGUAGE { SQL | PYTHON | SCALA | JAVA } |
    [NOT] DETERMINISTIC |
    COMMENT function_comment |
    [CONTAINS SQL | READS SQL DATA] |
    DEFAULT COLLATION default_collation_name |
    PARAMETER STYLE PANDAS |
    CREDENTIALS ( service_credential [, ...] ) |
    SECRETS ( secret_name [, ...] ) } |
    environment }

service_credential
    credential_name [ DEFAULT | AS credential_alias ]

secret_name
    catalog_name.schema_name.secret_name

environment
  ENVIRONMENT ( { environment_key = environment_value } [, ...] )

參數

  • 或替換

    如果指定,則會取代具有相同名稱和簽章的函式(參數和參數類型的數目)。 您無法以不同的簽章或程式取代現有的函式。 這主要用於更新函式主體和函式的傳回型別。 您無法使用 IF NOT EXISTS指定此參數。

  • 臨時的

    正在建立之函式的範圍。 當您指定 TEMPORARY時,所建立的函式有效且顯示在目前的會話中。 目錄中不會建立永久性條目。

  • 若不存在

    如果指定,則只會在函式不存在時建立函式。 如果指定的函式已存在於系統中,則函式的建立會成功(不會擲回錯誤)。 您無法使用 OR REPLACE指定此參數。

  • function_name

    函式的名稱。 針對永久函式,您可以選擇性地使用架構名稱來限定函式名稱。 如果名稱不合格,則會在目前的架構中建立永久函式。

    函式名稱對於架構中的所有例程(程式和函式)而言都必須是唯一的。

  • function_parameter

    指定函式的參數。

    • parameter_name

      參數名稱在函式內必須是唯一的。

    • 資料類型

      任何支援的數據類型。 針對 Python, data_type 會根據此 語言對應轉換成 Python 數據類型。

      STRING data_type的預設排序為函式default_collation_name。

    • 預設 default_expression

      適用於:勾選為「是」 Databricks SQL 勾選為「是」 Databricks Runtime 10.4 LTS 以上

      當函式調用未將自變數指派給 參數時,要使用的選擇性預設值。 default_expression必須可被轉換為。 表達式不得參考另一個參數或包含子查詢。

      當您指定一個參數的預設值時,下列所有參數也必須有預設值。

      DEFAULT 只支援 LANGUAGE SQL 。

    • 批註comment

      參數的選擇性描述。 comment 必須是 STRING 常值。

  • 傳回 data_type

    純量函式的傳回數據類型。 對於 Python UDF,回傳值應該與宣告的 data_type。

    對於 SQL UDF,這個子句是選擇性的。 如果沒有提供函式本體,資料型別就是從函式本體衍生出來的。

  • RETURNS TABLE [ (column_spec [,...] ) ]

    這個子句會將函式標示為數據表函式。 您也可以選擇性地指定數據表函式結果的簽章。 如果未指定任何 column_spec,則會從 SQL UDF 的內容中衍生出來。

    RETURNS TABLE 支援 LANGUAGE SQL 及用於 LANGUAGE PYTHON多態 UDTF (Databricks Runtime 18.1 及以上版本)。

    • 欄位名稱

      欄名稱在簽名中必須是唯一的。

    • 資料類型

      任何支援的數據類型。

    • 註解 column_comment

      數據行的選擇性描述。 comment 必須是 STRING 常值。

  • RETURN { 運算式 | 查詢 }

    函式的主體。 如果是純量函式,它可以是查詢或表達式。 針對數據表函式,它只能是查詢。 運算式不能包含:

    在函式的主體內,您可以透過參數的不限定名稱或將參數限定為函式名稱來參考參數。

  • AS 美元報價_定義

    dollar_quoted_definition是被兩個相同的body包圍的Python函式$[tag]$body$[tag]$。 tag 可以是空字串。

    範例:

    $$
      return “Hello world”
    $$
    
    $py$
      return "Hello World"
    $py$
    
  • 操控者handler_name

    對於一列一列的純量 LANGUAGE PYTHON 函數:

    適用於:勾選標記為是 Databricks SQL 勾選標記為是 Databricks 執行環境 18.1 及以上版本

    handler_name是STRING實作 UDF 的美元引號定義中 Python 函式的字面值。 處理器接受 UDF 參數,並回傳與宣告回傳類型相符的值。 在無伺服器運算以及專業版和無伺服器 SQL 倉庫上,明確將 UDF environment_version 設為 6 或更高。 參見「在純量 Python UDF 中使用命名處理器」。

    對於宣告為 PARAMETER STYLE PANDAS的批次LANGUAGE PYTHON函數:

    適用於:已勾選為是 Databricks SQL 已勾選為是 Databricks Runtime 16.3 和以上版本

    handler_name是STRING實作 UDF 的美元引號定義中 Python 函式的字面值。 處理器接受一個或多個 pandas.Series 物件的迭代器,並產生 pandas.Series 與輸入相同列數的物件。 請參見 批次 UDF 處理函式。

    對於 a LANGUAGE SCALA 或 LANGUAGE JAVA 函數:

    適用於:勾選標記為是 Databricks SQL 勾 選為 Databricks 執行時間 18.2 及以上版本

    這是實作 LANGUAGE SCALA or LANGUAGE JAVA 函式的方法的全限定路徑,作為 STRING 文字。 Scala 和 'package.Object.method' Java 都使用這個格式'package.ClassName.method'。 編譯後的程式碼必須透過 java_dependencies 子句的 ENVIRONMENT 鍵碼以 JAR 形式提供。

  • CREDENTIALS (service_credential[, ...])

    適用於:已勾選為是 Databricks SQL 已勾選為是 Databricks Runtime 16.3 和以上版本

    宣告一個或多個 Unity Catalog 服務憑證,批次 LANGUAGE PYTHON 函式可以使用。 列一列的標量 LANGUAGE PYTHON 函式在經典運算上需要 Databricks Runtime 18.1 或以上的效能。 在無伺服器運算以及專業與無伺服器 SQL 倉庫中,純量函式必須明確設定 environment_version 為或 6 更高。 完整需求請參見「在 Python UDF 中使用服務憑證」。

    每個網站 credential_name 都指定一個 Unity 目錄服務憑證。 UDF 創建者必須擁有 ACCESS 每個服務憑證的權限。 最多標記一個憑證 DEFAULT ,讓經過修補的雲端 SDK 自動使用。 用 AS credential_alias 來為非預設的憑證指派一個獨特的別名。

  • 祕密(secret_name[, ...])

    適用於:勾選標記為是 Databricks SQL 勾選為 Databricks 執行時間 19 及以上

    宣告 Unity 目錄的機密,讓純量、批次 LANGUAGE PYTHON 函數或純量 LANGUAGE SCALA 函式能存取。 UDF 定義必須明確設 environment_version 為或 6 更高。 每個 secret_name 名稱必須是形式 catalog.schema.secret為三部分的名稱。 要建立或替換 UDF,你必須在每個秘密及其USE CATALOGUSE SCHEMA父目錄和結構上都擁有 READ SECRET 。 請參閱 UDF 要求與權限 ,以了解運算支援與執行時權限行為。 例如,請參見 Python UDF 或 Scala UDF。

  • 特徵

    所有特性子句都是選擇性的。 您可以依任何順序指定任意數目,但只能指定每個子句一次。

    • 語言 SQL、語言 PYTHON、語言 SCALA 或語言 JAVA

      函式實作的語言。 LANGUAGE SCALA 並 LANGUAGE JAVA 要求 Unity 目錄及一個 HANDLER 引用經該 ENVIRONMENT 子句提供的編譯程式碼的子句。 請參閱 Unity 目錄中的 Scala 與 Java 使用者定義函式(UDF)。

    • 參數樣式 PANDAS

      適用於:已勾選為是 Databricks SQL 已勾選為是 Databricks Runtime 16.3 和以上版本

      宣告一個批次 LANGUAGE PYTHON 函式,與處理程序交換資料,作為物件的 pandas.Series 迭代者。 你也必須指定一個 HANDLER 條款。 請參閱 Unity Catalog 內的批次 Python 使用者定義函式(UDF)。

    • [NOT]非決定性

      函式是否具決定性。 當函式只針對一組指定的自變數傳回一個結果時,函式會具決定性。 當函式主體不是時,您可以將函式標示為 DETERMINISTIC ,反之亦然。 這可能是由於希望鼓勵或抑制查詢優化,例如常數折疊或查詢快取。 如果你沒有指定這個選項,預設值會依函式的語言而定。 對於 SQL 函式,它是從函式主體衍生出來的。 對於 Python、Scala 和 Java 函式,函式為 NOT DETERMINISTIC。

    • 註釋 function_comment

      函式的註解。 function_comment 必須是 String 常值。

    • 包含 SQL 或 讀取 SQL 資料

      函式是否會直接或間接地從資料表或檢視表中讀取數據。 當函式讀取 SQL 資料時,您無法指定 CONTAINS SQL。 如果您未指定任一子句,屬性會衍生自函式主體。

    • 預設排序 default_collation_name

      適用於:勾選是 Databricks SQL 勾選是 Databricks Runtime 17.0 及以上版本

      定義要用於下列項目的默認排序規則:

      • STRING 函式的參數和 RETURNS 數據類型和 RETURNS TABLE 欄位。
      • DEFAULT 表達式。
      • SQL 函式的主體。

      如果未指定,預設定序會取自建立函式的結構描述。

  • environment (環境)

    指定以 、 LANGUAGE PYTHONLANGUAGE SCALA、 或 LANGUAGE JAVA宣告的函數環境。 SQL 函式不支援 ENVIRONMENT 子句。 您必須說明 environment_version 何時加入該 ENVIRONMENT 條款。

    • 相依性

      一個 JSON 字串陣列,指定函式所需的 Python 套件或輪子檔案LANGUAGE PYTHON。 這個 dependencies 鍵不區分大小寫。 支援的格式:

      對於儲存在 Unity 目錄卷中的相依,函式建立者必須在原始磁碟區有 READ VOLUME 相關功能。 呼叫者的需求取決於環境版本。 請參閱 Unity 目錄卷中相依關係的權限。

    • java_dependencies

      適用於:勾選標記為是 Databricks SQL 勾 選為 Databricks 執行時間 18.2 及以上版本

      一個 JSON 字串陣列,指定包含編譯後 LANGUAGE SCALA or LANGUAGE JAVA 函式程式碼的 JAR 檔案。 每個項目都是 Unity 目錄卷中儲存的 JAR 檔案的絕對路徑,例如:「/Volumes/my_catalog/my_schema/my_volume/packages/my-udf-assembly-0.1.0.jar」。 將程式碼打包成一個包含 UDF 所有第三方相依的 fat JAR 格式。

    • 環境版本

      一個指定環境版本的字串。

      • 對於 LANGUAGE PYTHON,支援的值為環境版本為3或以上,例如 '6'、或 'None'。 該值'None'選擇預設的 Python 環境。 在經典運算中,若要設定 environment_version 為非 的 'None' 值,則需要 Databricks 執行時 18.2 或以上。 在 Databricks 執行環境 16.2 至 18.1 中,僅 'None' 支援 當支援固定環境版本時,明確選擇一個以符合可預測行為的版本。

        在無伺服器運算以及專業與無伺服器 SQL 倉庫中,有些功能需要明確的環境版本。 在每個 UDF 定義中設定 environment_version 為所需版本或更高。 省略該條款或設定 environment_version = 'None' 並不會啟用這些功能。 請參見 Python UDF 功能要求。

        關於經典計算版本相容性,請參見 經典計算環境版本。 有關可用版本列表,請參見 環境版本。

      • 對於 LANGUAGE SCALA 和 LANGUAGE JAVA,該值必須是 '4' 或大於。 環境版本 4 規定使用 Scala 2.13.16 與 JDK 17。 請參閱 環境版本。

Python UDF 中支持的函式庫

若要使用任何相依性,請在函式主體內使用 import <package> 。 例如,請參閱下列內容:

CREATE FUNCTION […]
AS $$
   import json
   [... (rest of function definition)]
$$

根據預設,相依性會限制為標準 Python 連結庫和下列連結庫:

套件 版本
漂白劑 4.0.0
chardet 4.0.0
charset-normalizer(字符集正規化器) 2.0.4
defusedxml(安全解析XML的Python函式庫) 0.7.1
googleapis-common-protos 1.56.4
grpcio 1.47.0
grpcio-status 1.47.0
jmespath 0.10.0
joblib 1.1.0
numpy(數值計算套件) 1.20.3
包裝 21.3
熊貓 1.3.4
替罪羊 0.5.2
協議緩衝區 (Protocol Buffers) 4.21.5
pyarrow 7.0.0
pyparsing(Python 字符串解析库) 3.0.9
python-dateutil 2.8.2
pytz(Python 的時區計算函式庫) 2021.3
scikit-learn(機器學習套件) 0.24.2”
scipy科學計算庫 1.7.1”
setuptools 65.2.0
六 1.16.0
線程池控制器 3.1.0
網頁編碼 0.5.1
使用者代理 2.2.0
加密 38.0.4

Python UDF 中的自定義相依性

若要使用標準連結庫和支援的內建套件以外的其他相依性,請在 子句中 ENVIRONMENT 指定它們。

範例

建立和使用 SQL 純量函式

> CREATE VIEW t(c1, c2) AS VALUES (0, 1), (1, 2);
-- Create a temporary function with no parameter.
> CREATE TEMPORARY FUNCTION hello() RETURNS STRING
    RETURN 'Hello World!';

> SELECT hello();
  Hello World!

-- Create a permanent function with parameters.
> CREATE FUNCTION area(x DOUBLE, y DOUBLE) RETURNS DOUBLE RETURN x * y;

-- Use a SQL function in the SELECT clause of a query.
> SELECT area(c1, c2) AS area FROM t;
 0.0
 2.0

-- Use a SQL function in the WHERE clause of a query.
> SELECT * FROM t WHERE area(c1, c2) > 0;
 1  2

-- Compose SQL functions.
> CREATE FUNCTION square(x DOUBLE) RETURNS DOUBLE RETURN area(x, x);

> SELECT c1, square(c1) AS square FROM t;
  0  0.0
  1  1.0

-- Create a non-deterministic function
> CREATE FUNCTION roll_dice()
    RETURNS INT
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Roll a single 6 sided die'
    RETURN (rand() * 6)::INT + 1;
-- Roll a single 6-sided die
> SELECT roll_dice();
 3

建立並使用含有 DEFAULT 的函式

-- Extend the function to support variable number of sides and dice.
-- Use defaults to support a variable number of arguments
> DROP FUNCTION roll_dice;
> CREATE FUNCTION roll_dice(num_dice  INT DEFAULT 1 COMMENT 'number of dice to roll (Default: 1)',
                            num_sides INT DEFAULT 6 COMMENT 'number of sides per die (Default: 6)')
    RETURNS INT
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Roll a number of n-sided dice'
    RETURN aggregate(sequence(1, roll_dice.num_dice, 1),
                     0,
                     (acc, x) -> (rand() * roll_dice.num_sides)::int,
                     acc -> acc + roll_dice.num_dice);

-- Roll a single 6-sided die still works
> SELECT roll_dice();
 3

-- Roll 3 6-sided dice
> SELECT roll_dice(3);
 15

-- Roll 3 10-sided dice
> SELECT roll_dice(3, 10)
 21

-- Roll 3 10-sided dice using named parameter invocation
> SELECT roll_dice(10 => num_sides, num_dice => 3)
 17

-- Create a SQL function with a scalar subquery.
> CREATE VIEW scores(player, score) AS VALUES (0, 1), (0, 2), (1, 2), (1, 5);

> CREATE FUNCTION avg_score(p INT) RETURNS FLOAT
    COMMENT 'get an average score of the player'
    RETURN SELECT AVG(score) FROM scores WHERE player = p;

> SELECT c1, avg_score(c1) FROM t;
 0  1.5
 1  3.5

建立 SQL 數據表函式

-- Produce all weekdays between two dates
> CREATE FUNCTION weekdays(start DATE, end DATE)
    RETURNS TABLE(day_of_week STRING, day DATE)
    RETURN SELECT extract(DAYOFWEEK_ISO FROM day), day
             FROM (SELECT sequence(weekdays.start, weekdays.end)) AS T(days)
                  LATERAL VIEW explode(days) AS day
             WHERE extract(DAYOFWEEK_ISO FROM day) BETWEEN 1 AND 5;

-- Return all weekdays
> SELECT weekdays.day_of_week, day
    FROM weekdays(DATE'2022-01-01', DATE'2022-01-14');
  1     2022-01-03
  2     2022-01-04
  3     2022-01-05
  4     2022-01-06
  5     2022-01-07
  1     2022-01-10
  2     2022-01-11
  3     2022-01-12
  4     2022-01-13
  5     2022-01-14

-- Return weekdays for date ranges originating from a LATERAL correlation
> SELECT weekdays.*
    FROM VALUES (DATE'2020-01-01'),
                (DATE'2021-01-01'),
                (DATE'2022-01-01') AS starts(start),
         LATERAL weekdays(start, start + INTERVAL '7' DAYS);
  3     2020-01-01
  4     2020-01-02
  5     2020-01-03
  1     2020-01-06
  2     2020-01-07
  3     2020-01-08
  5     2021-01-01
  1     2021-01-04
  2     2021-01-05
  3     2021-01-06
  4     2021-01-07
  5     2021-01-08
  1     2022-01-03
  2     2022-01-04
  3     2022-01-05
  4     2022-01-06
  5     2022-01-07

取代 SQL 函式

-- Replace a SQL scalar function.
> CREATE OR REPLACE FUNCTION square(x DOUBLE) RETURNS DOUBLE RETURN x * x;

-- Replace a SQL table function.
> CREATE OR REPLACE FUNCTION getemps(deptno INT)
    RETURNS TABLE (name STRING)
    RETURN SELECT name FROM employee e WHERE e.deptno = getemps.deptno;

-- Describe a SQL table function.
> DESCRIBE FUNCTION getemps;
 Function: default.getemps
 Type:     TABLE
 Input:    deptno INT
 Returns:  id   INT
           name STRING

注意

您無法以不同的簽名取代現有的函式。

描述 SQL 函式

> DESCRIBE FUNCTION hello;
 Function: hello
 Type:     SCALAR
 Input:    ()
 Returns:  STRING

> DESCRIBE FUNCTION area;
 Function: default.area
 Type:     SCALAR
 Input:    x DOUBLE
           y DOUBLE
 Returns:  DOUBLE

> DESCRIBE FUNCTION roll_dice;
 Function: default.roll_dice
 Type:     SCALAR
 Input:    num_dice  INT
           num_sides INT
 Returns:  INT

> DESCRIBE FUNCTION EXTENDED roll_dice;
 Function:      default.roll_dice
 Type:          SCALAR
 Input:         num_dice  INT DEFAULT 1 'number of dice to roll (Default: 1)'
                num_sides INT DEFAULT 6 'number of sides per dice (Default: 6)'
 Returns:       INT
 Comment:       Roll a number of m-sided dice
 Deterministic: false
 Data Access:   CONTAINS SQL
 Configs:       ...
 Owner:         the.house@always.wins
 Create Time:   Sat Feb 12 09:29:02 PST 2022
 Body:          aggregate(sequence(1, roll_dice.num_dice, 1),
                      0,
                      (acc, x) -> (rand() * roll_dice.num_sides)::int,
                      acc -> acc + roll_dice.num_dice)

建立 Python 函式

-- Hello World-like functionality using Python UDFs
> CREATE FUNCTION main.default.greet(s STRING)
  RETURNS STRING
  LANGUAGE PYTHON
  AS $$
    def greet(name):
      return "Hello " + name + "!"

    return greet(s) if s else None
  $$

-- Can import functions from std library and environment
> CREATE FUNCTION main.default.isleapyear(year INT)
  RETURNS BOOLEAN
  LANGUAGE PYTHON
  AS $$
    import calendar
    return calendar.isleap(year) if year else None
  $$

-- Return values should match the declared data type.
> CREATE FUNCTION main.default.a_number()
  RETURNS INTEGER
  LANGUAGE PYTHON
  AS $$
    return 10
  $$

-- Deal with exceptions.
> CREATE FUNCTION main.default.custom_divide(n1 INT, n2 INT)
  RETURNS FLOAT
  LANGUAGE PYTHON
  AS $$
    try:
      return n1/n2
    except ZeroDivisionException:
    # in case of 0, we can return NULL.
    return None
  $$

在 Python 函式中定義自定義相依性

-- Create a Python function with additional dependencies using the ENVIRONMENT clause.
> CREATE FUNCTION main.default.dump_json(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))
    $$;

-- Use the Python function in a query.
> SELECT dump_json('{"foo": "bar"}');

建立 Scala 與 Java 函式

以下範例是從編譯的 JVM 程式碼中,以 JAR 封裝於 Unity 目錄卷中的 UDF 註冊。 子 HANDLER 句在 JAR 中引用方法,鍵 java_dependencies 也指向 JAR。 完整工作流程,包括如何建置 JAR,請參閱 Unity 目錄中的 Scala 與 Java 使用者定義函式(UDF)。

-- Register a Scala UDF from a JAR in a Unity Catalog volume.
> CREATE OR REPLACE FUNCTION my_catalog.my_schema.add_one_scala(x INT)
    RETURNS INT
    LANGUAGE SCALA
    DETERMINISTIC
    ENVIRONMENT (
      java_dependencies = '["/Volumes/my_catalog/my_schema/udf_jars/my-udf-assembly-0.1.0.jar"]',
      environment_version = '4'
    )
    HANDLER 'com.example.ScalaUDF.addOne';

-- Register a Java UDF from a JAR in a Unity Catalog volume.
> CREATE OR REPLACE FUNCTION my_catalog.my_schema.add_one_java(x INT)
    RETURNS INT
    LANGUAGE JAVA
    DETERMINISTIC
    ENVIRONMENT (
      java_dependencies = '["/Volumes/my_catalog/my_schema/udf_jars/my-udf-1.0.jar"]',
      environment_version = '4'
    )
    HANDLER 'com.example.JavaUDF.addOne';

-- Use the functions in a query.
> SELECT my_catalog.my_schema.add_one_scala(5);
 6
> SELECT my_catalog.my_schema.add_one_java(5);
 6