こちらの機能を試します。というか、最近まで気づいていませんでした。
プレビュー
本機能はパブリックプレビューです。Databricks Runtime 13.2 以降が必要です。
要はSQLやPythonの関数(User-defined function:UDF)をUnity Catalog(カタログエクスプローラ)で管理できる機能です。権限設定やリネージなどの機能を活用できます。
ただ、パブリックプレビューであることもあり、いくつかの制限があります。以下に列挙します。
- Databricks Runtime 13.2 以降が必要です。
- Gravitonインスタンスではサポートされません。
- 従来のPython UDFのスコープはSparkSessionですが、こちらはカタログエクスプローラで管理されるので、権限が許可される限りDatabricksアカウントで共有されます。
SQLのUDF
以下のSQLを実行すると指定したカタログ、スキーマの配下に関数が作成されます。
CREATE FUNCTION takaakiyayoi_catalog.default.simple_roll_dice()
RETURNS INT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
COMMENT 'Roll a single 6 sided die'
RETURN (rand() * 6)::INT + 1;
SELECT takaakiyayoi_catalog.default.simple_roll_dice()
PythonのUDF
Pythonの方が自由度の高い分、制限も増えます。
- Python UDFは安全で分離された環境で実行され、ファイルシステムや内部サービスにアクセスできません。
- Python UDFはスカラー値を返す必要があります。UDTF(ユーザー定義テーブル関数)やUDAF(ユーザー定義集計関数)はサポートされていません。
- 標準のPythonライブラリをインポートできますが、カスタムライブラリや外部の依存関係を持ち込むことはできません。
- PySparkから呼び出すことはできず、Spark SQLからのみ呼び出すことができます。
CREATE OR REPLACE FUNCTION takaakiyayoi_catalog.default.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)
$$
SELECT takaakiyayoi_catalog.default.roll_dice(3, 6)