メインコンテンツまでスキップ

ユーザー定義関数 (UDF) とは何ですか?

ユーザー定義関数 (UDF) を使用すると、Databricks の組み込み機能を拡張するコードを再利用および共有できます。UDFs を使用して、複雑な計算、変換、カスタムデータ操作などの特定のタスクを実行します。

UDF と Apache Spark 関数をいつ使用するか

UDFs は、組み込みの Apache Spark 関数では表現しにくいロジックに使用します。組み込みの Apache Spark 関数は、分散処理用に最適化されており、大規模でより優れたパフォーマンスを提供します。詳細については、「 関数」を参照してください。

Databricks では、アドホック クエリ、手動データクレンジング、探索的データ分析、および小規模から中規模のデータセットに対する操作に UDF を推奨しています。 UDF の一般的なユースケースには、データの暗号化、復号化、ハッシュ化、JSON 解析、検証などがあります。

Apache Spark メソッドは、非常に大規模なデータセットに対する操作や、ETL ジョブやストリーミング操作など、定期的または継続的に実行されるワークロードに対して使用します。

UDF タイプを理解する

次のタブから UDF タイプを選択すると、説明、例、および詳細を確認するためのリンクが表示されます。

スカラー UDF は 1 つの行で動作し、各行に対して 1 つの結果値を返します。これらは、Unity Catalog で管理することも、セッション スコープにすることもできます。

次の例では、スカラー UDF を使用して、 name 列の各名前の長さを計算し、新しい列 name_lengthに値を追加します。

+-------+-------+
| name | score |
+-------+-------+
| alice | 10.0 |
| bob | 20.0 |
| carol | 30.0 |
| dave | 40.0 |
| eve | 50.0 |
+-------+-------+
SQL
-- Create a SQL UDF for name length
CREATE OR REPLACE FUNCTION main.test.get_name_length(name STRING)
RETURNS INT
RETURN LENGTH(name);

-- Use the UDF in a SQL query
SELECT name, main.test.get_name_length(name) AS name_length
FROM your_table;
+-------+-------+-------------+
| name | score | name_length |
+-------+-------+-------------+
| alice | 10.0 | 5 |
| bob | 20.0 | 3 |
| carol | 30.0 | 5 |
| dave | 40.0 | 4 |
| eve | 50.0 | 3 |
+-------+-------+-------------+

これを PySpark を使用して Databricks ノートブックに実装するには、次のようにします。

Python
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType

@udf(returnType=IntegerType())
def get_name_length(name):
return len(name)

df = df.withColumn("name_length", get_name_length(df.name))

# Show the result
display(df)

「Unity Catalog のユーザー定義関数 (UDF)」と「ユーザー定義スカラー関数 - Python」を参照してください。

Unity Catalog のガバナンスとセッション スコープの UDFs

Unity Catalog Python UDFs とバッチ Unity Catalog Python UDFs は、ガバナンス、再利用、検出可能性を向上させるために、Unity Catalog に保持されます。他のすべての UDF はセッションベースであり、ノートブックまたはジョブで定義され、現在の SparkSession にスコープが設定されます。セッションスコープの UDF を定義してアクセスするには、Scala または Python を使用します。

Unity Catalog で管理された UDF のチート シート

Unity Catalog で管理される UDF を使用すると、カスタム関数を定義、使用、安全に共有、およびコンピューティング環境間で管理できます。「Unity Catalog のユーザー定義関数 (UDF)」を参照してください。

UDFタイプ

対応コンピュート

説明

Unity Catalog Python UDF

  • サーバレス ノートブック and ジョブ
  • 標準アクセスモードのクラシックコンピュート(Databricks Runtime 14.1以降)
  • SQLウェアハウス (サーバレス, PRO, CLASSIC)
  • DLT (クラシックおよびサーバレス)

UDFPythonでUnity Catalog を定義し、ガバナンスのために に登録する。

スカラー UDF は 1 つの行で動作し、各行に対して 1 つの結果値を返します。

バッチ Unity Catalog Python UDF

  • サーバレス ノートブック and ジョブ
  • 標準アクセスモードのクラシックコンピュート(Databricks Runtime 16.3以降)
  • SQLウェアハウス (サーバレス, PRO, CLASSIC)
  • DLT (クラシックおよびサーバレス)

UDFPythonでUnity Catalog を定義し、ガバナンスのために に登録する。

複数の値に対するバッチ操作を行い、複数の値を返します。大規模なデータ処理のための行ごとの操作のオーバーヘッドを削減します。

セッション スコープ UDFs ユーザー分離コンピュートのチート シート

セッション スコープの UDF は、ノートブックまたはジョブで定義され、現在の SparkSession にスコープが設定されます。セッションスコープの UDF を定義してアクセスするには、Scala または Python を使用します。

UDFタイプ

Databricks Runtimeのバージョン

対応コンピュート

説明

Python スカラー

  • サーバレス ノートブック and ジョブ
  • 標準アクセスモードのクラシックコンピュート(Databricks Runtime 14.3 LTS 以上)

スカラー UDF は 1 つの行で動作し、各行に対して 1 つの結果値を返します。

Pandas UDF(ベクトル化)

  • サーバレス ノートブック and ジョブ
  • 標準アクセスモードのクラシックコンピュート(Databricks Runtime 14.3 LTS 以上)

Pandas UDF は Apache Arrow を使用してデータを転送し、 Pandas データを操作します。 Pandas UDFs は、行ごとのスカラー UDFs.length よりもパフォーマンスを大幅に向上させることができるベクトル化された操作をサポートしています。

Python の UDTF

  • サーバレス ノートブック and ジョブ
  • 標準アクセスモードのクラシックコンピュート(Databricks Runtime 14.3 LTS 以上)

UDTF は 1 つ以上の入力引数を受け取り、各入力行に対して複数の行 (場合によっては複数の列) を返します。

Scala スカラー UDFs

  • 標準アクセスモードのクラシックコンピュート(Databricks Runtime 14.2以上)

スカラー UDF は 1 つの行で動作し、各行に対して 1 つの結果値を返します。

Scala UDAFs

  • 標準アクセスモードのクラシックコンピュート(Databricks Runtime 15.4以上)

UDAFs 複数の行を操作し、1 つの集計結果を返します。

パフォーマンスに関する考慮事項

  • 組み込み関数SQL UDF は、最も効率的なオプションです。

  • Scala UDFs は一般的に Python UDFs よりも高速です。

    • 分離されていない Scala UDF は Java 仮想マシン (JVM) で実行されるため、JVM との間でデータを移動するオーバーヘッドを回避できます。
    • 分離された Scala UDF は、JVM との間でデータを移動する必要がありますが、メモリをより効率的に処理するため、Python UDF よりも高速になる可能性があります。
  • PythonUDFPandas UDF Scalaは、データをシリアル化し、JVM からPython インタープリターに移動する必要があるため、 UDF よりも遅くなる傾向があります。

    • Pandas UDFs は、Apache Arrow を使用してシリアル化コストを削減するため、Python UDF よりも最大 100 倍高速です。