Unity Catalog のユーザー定義関数 (UDF)

重要

この機能は、パブリック プレビュー段階であり、Databricks Runtime 13.3 LTS 以降を必要とします。

Azure Databricks には、Unity Catalog によって管理されるスキーマにカスタム関数を登録するための SQL ネイティブ構文が用意されています。 標準的な CREATE FUNCTION SQL 構文は、Azure Databricks 上のすべての Unity Catalog コンピューティングでサポートされています。 プロまたはサーバーレス SQL ウェアハウスおよび Databricks Runtime 13.3 LTS 以降では、Unity Catalog に登録されている関数に Python コードを含めることができます。

Note

UDF を使用するクエリから登録されたビューでは、サポートされているコンピューティングを使用する必要があります。 クラシック SQL ウェアハウスと Databricks Runtime 12.2 LTS 以前では、Unity Catalog に登録されている UDF を含むビューを解決できません。

完全な SQL 言語リファレンスについては、「CREATE FUNCTION (SQL および Python)」を参照してください。

Unity Catalog が関数に対するアクセス許可を管理する方法については、「CREATE FUNCTION」を参照してください。

重要

Unity Catalog の関数として登録されている Python UDF は、スコープとサポートが、ノートブックまたは SparkSession にスコープ指定された PySpark UDF とは異なります。 「ユーザー定義スカラー関数 - Python」を参照してください。

Unity Catalog のカスタム SQL 関数

Unity Catalog 用に構成されたコンピューティングを使用して 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 Catalog 用に構成されたコンピューティング環境でその関数を使用できます。

SELECT target_catalog.target_schema.roll_dice()

Note

LANGUAGE SQL を使用する UDF を使用して、テーブルまたはスカラー値を返すことができます。

Python UDF を Unity Catalog に登録する

Databricks Runtime 13.3 LTS 以降では、SQL CREATE FUNCTION ステートメントを使用してスカラー Python UDF を Unity Catalog に登録できます。

重要

Unity Catalog 用の Python UDF をサポートするのは、プロおよびサーバーレス SQL ウェアハウスのみです。

Python UDF は、SQL 関数内で直接 Python の完全な表現力を提供するように設計されており、高度な変換、データ マスク、ハッシュなどのカスタマイズされた操作を可能にします。

Python UDF は、セキュリティで保護された分離された環境で実行され、ファイル システムや内部サービスへのアクセス権は持ちません。

サーバーレス コンピューティングまたは共有アクセス モードで実行されている Python UDF では、ポート 80、443、53 経由の TCP/UDP ネットワーク トラフィックが許可されます。

最も効率的な UDF はどれか」を参照してください。

Note

Unity Catalog の Python UDF の構文とセマンティクスは、SparkSession に登録されている Python UDF とは異なります。 「ユーザー定義スカラー関数 - Python」を参照してください。

Unity Catalog 用の Python 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)
$$