SQLに力を：Databricks SQLにおけるPython UDFのご紹介

[Power to the SQL People: Introducing Python UDFs in Databricks SQL \- The Databricks Blog](https://databricks.com/blog/2022/07/22/power-to-the-sql-people-introducing-python-udfs-in-databricks-sql.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

先月のData & AIサミットでDatabricks SQL(DBSQL)におけるPythonユーザー定義関数(UDF)のプレビューを発表できたことを大変嬉しく思っています。このブログ記事では、新機能の概要を説明し、本機能とそのユースケースを説明するサンプルをウォークスルーします。

Python UDFを用いることで、ユーザーは簡単かつセキュア、そして完全に管理された方法を通じて、SQL関数を通じてPythonコードを記述し、呼び出すことができるようになり、PythonのパワーをDatabricks SQLに持ち込むことができます。

# Databricks SQLにおけるPython UDFのご紹介

DatabricksとApache Spark™においては、UDFは通常Sparkを拡張します：ユーザーとして、データを変換したりマスキングするなどSparkの語彙を拡張する再利用可能な関数としてビジネスロジックを定義し、アプリケーションを通じて再利用することができます。Databricks SQL向けPython UDFを用いることで、[SQL UDF](https://qiita.com/taka_yayoi/items/80862e2f8d01e4306a79)における現状のサポートを拡張することができます。

それでは、Python UDFのサンプルを見ていきましょう。以下の関数はJSON文字列からメールと電話番号の情報を検閲し、機微なデータに対する許可されないアクセスを防ぐなどの目的で検閲済みの結果を文字列を返却します。

```sql:SQL
CREATE FUNCTION redact(a STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
import json
keys = ["email", "phone"]
obj = json.loads(a)
for k in obj:
  if k in keys:
    obj[k] = "REDACTED"
return json.dumps(obj)
$$;
```

Python UDFを定義するために必要なのは`CREATE FUNCTION SQL`文です。この文では関数名、入力パラメーターと型を定義し、言語として`PYTHON`を指定し、関数の本体を`$$`の間に定義します。

Databricks SQLにおけるPython UDFの関数本体は、一般的なPython関数と同じものであり、UDF自身は計算の最終結果を返却します。上の例におけるjsonパッケージのようなPythonの標準的なライブラリや[Databricks Runtime 10\.4](https://docs.databricks.com/release-notes/runtime/10.4.html#system-environment)をインポートすることができ、お使いのコードで利用することができます。また、複雑なロジックを記述し、再利用するためにコードをカプセル化するために、お使いのUDFの中にネスト化された関数を定義することもできます。

この時点から、適切な権限を持つ全てのユーザーがクエリーの一部のSELECT、JOIN、WHEREの中でビルトイン関数を使うのと同じようにこの関数を呼び出すことができるようになります。

# Databricks SQLにおけるPython UDFの機能

ここまでで、Databricks SQLでPython UDFを定義するがどれだけ簡単なのかを説明したので、Databricks SQLおよびレイクハウスでどのように管理され、利用されるのかを見ていきましょう。

## 全ワークスペースにおけるPython UDFの管理と統制

Python UDFは強力かつきめ細かい管理とガバナンスの手段を提供する[Unity Catalog](https://databricks.com/product/unity-catalog)の一部として定義、管理されます。

- Python UDFのアクセス権はGRANTやREVOKE文を用いて、全てのワークスペースにおけるグループ(推奨です)、ユーザーレベルで管理することができます。
- Python UDFを作成するためには、スキーマ(データベース)に対するUSAGEとCREATE権限、カタログに対するUSAGE権限が必要です。UDFを実行するには、ユーザーはUDFに対するEXECUTE権限が必要です。例えば、*finance-analysts*グループに、上記の検閲用Python UDFをSQL文で使用する権限を付与するには、以下の文を実行します。

```sql:SQL
GRANT EXECUTE ON silver.finance_db.redact TO finance-analysts
```

- finance-analystグループのメンバーは、以下のように自身のSQL文で検閲用UDFを使用することができます。ここでは、`contact_info`カラムには電話番号やメールアドレスは含まれないことになります。

```sql:SQL
SELECT account_nr, redact(contact_info) FROM silver.finance_db.customer_data
```

## エンタープライズレベルのセキュリティとマルチテナンシー

Pythonの偉大なパワーは、それだけの責任を伴うことになります。Databricks SQLとPython UDFが企業のセキュリティと規模に確実に適合できるように、皆様のニーズを満たせるように特別の注意を払いました。

このため、お使いのSQLウェアハウス(SQLエンドポイント)におけるPythonコードの処理から、計算資源とデータは完全に保護されます。Pythonコードはセキュアな環境で実行されるので、以下のことを防ぎます。

- UDFのパラメーターとして指定されていないPython実行環境外にあるファイルシステムやメモリーを含むデータへのアクセス。
- ネットワーク、プロセス間通信を含む外部サービスへのコミュニケーション。

この実行モデルは、いかなるセキュリティ要件を犠牲することなしに、追加のPython処理を活用する複数ユーザーによるクエリーの同時実行をサポートするために完全に構築されています。

## Python UDFで少ない手間で多くのことを

拡張性のあるメカニズムを提供するので、PYthon UDFを用いてカスタムビジネスロジックを実装するユースケースには事欠きません。

Pythonは、SQLでできる範囲外のカスタマイゼーションを必要とする複雑なパーシングやデータ変換ロジックを記述するには非常に適しています。データを保護するための非常に特別あるいはプロプライエタリな方法を探しているのであれば、これに当てはまることでしょう。Python UDFを用いることで、カスタムのトークン化、データマスキング、データ検閲、暗号化メカニズムを実装することができます。

また、データを高度な計算処理、あるいは機械学習モデルの予測結果で拡張したい場合であってもPython UDFは非常に役立ちます。事例には、すぐに利用することが難しい高度な位置空間機能や、NumPyやpandasを用いた数値、統計処理などが含まれます。

## 既存コードとパワフルなライブラリの再利用

もし、既にデータを処理するPython関数や分析スタックをお持ちなのであれば、Python UDFを用いて、そのコードを簡単にDatabricks SQLに持ち込むことができます。これによって、皆様の投資をDatabricks SQLで活かすことができ、新たなワークロードに迅速に対応できるようになります。

また、Pythonの標準ライブラリとDatabricksランタイムの全てのパッケージにアクセスできるようになることで、ライブラリを用いて機能を開発することができるようになり、コードを高品質に保てるのと同時に、皆様の時間をより効率的なものにします。

# Databricks SQLとレイクハウスでPython UDFを使ってみる

既にDatabricksを利用されているのであれば、[プライベートプレビューにサインアップ](https://dbricks.co/udfpreview)してみてください。プライベートプレビューをスタートするために必要な情報やドキュメントをご提供します。

Unity Catalogについて詳細を知りたいのであれば、[ウェブサイト](https://databricks.com/product/unity-catalog)をチェックしてみてください。Databricksをまだ利用したことがないのでしたら、[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)にサインアップし、Python UDF、Databricks SQL、そしてDatabricksレイクハウスプラットフォームの果てることのない可能性を探索してみてください。

Data + AI Summit 2022での発表やアップデートに関して、データに熱中している人たちが会話している[Databricks Community](https://community.databricks.com/s/topic/0TO8Y000000VJEhWAO/summit22?_gl=1*y9zcwk*_gcl_aw*R0NMLjE2NTgxMDIzNTguQ2owS0NRandrSUdLQmhDeEFSSXNBSU5NaW9LWTdZVXBwWGdlbzFhYk1GbzZrQzIwcGtTZzhXWExGWUFHaVJmTHVoNjdFUmgzYTFiRlFFTWFBbkRrRUFMd193Y0I.&_ga=2.227792031.329306727.1658647744-484468202.1622143576)に参加してみてください。学び、ネットワークを作り、祝いましょう。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)