トップ / 基礎知識
Snowflake上でカスタムロジックを実行する4つの手段を、入出力の形とSQLからの呼び出し方で整理します。
スカラUDFは行ごとに呼び出され、1つの値を返す関数です。SELECT句やWHERE句などのSQL式の中から直接呼び出せます。Python UDFの場合、1行ずつPythonの関数を呼び出すため、行数が多いとPythonの呼び出しオーバーヘッドが積み重なります。
Vectorized UDF(バッチUDF)は、複数行をPandasのDataFrameやSeriesとしてまとめて受け取り、まとめて結果を返す仕組みです。Snowflake公式ドキュメントは「Vectorized Python UDFは、入力行のバッチをPandas DataFrameとして受け取り、結果のバッチをPandas配列またはSeriesとして返すPython関数を定義できる」と説明しています。1行ずつPythonを呼び出すオーバーヘッドを避けられるため、機械学習の推論のようにバッチ処理に向く場面で特に有効です。
UDTF(ユーザー定義テーブル関数)は、入力に対して0行以上の複数行を出力できる関数です。公式ドキュメントによれば、UDTFのハンドラクラスは行ごとに呼び出されるprocessメソッドを実装し、そこでタプルとして表形式の値を返します。SQLのFROM句から呼び出す点がスカラUDFと異なります。
ストアドプロシージャ(SPROC)は、条件分岐・ループ・トランザクション管理・DDL/DMLの実行といった「処理の手順そのもの」をパッケージ化したものです。SQL式の中から呼び出すのではなく、CALL文で独立して実行します。UDF・UDTFにはできないDDL/DMLの実行が可能な点が大きな違いです。
| 種類 | 主な目的 | 戻り値 | SQL式内から直接呼べるか | DDL/DMLの実行 |
|---|---|---|---|---|
| スカラUDF | 行ごとの計算・変換 | 単一の値 | 可能 | 不可 |
| Vectorized UDF | バッチ単位の高速演算 | 単一の値(バッチ処理) | 可能 | 不可 |
| UDTF | 表構造への展開・変換 | 複数行・複数列 | 可能(FROM句内) | 不可 |
| ストアドプロシージャ | パイプライン制御・自動化 | 任意 | 不可(CALL文) | 可能 |
Polarsはローカルで動くライブラリなので、この4分類そのものが存在しません。Polarsで「カスタムロジック」というと、map_elementsのようなメソッドにPython関数を渡す形が中心で、SQLエンジン側にプッシュダウンして実行させるという概念がそもそもありません。
公式ドキュメントの記載にもとづく解説です(実行検証はしていません)。確認日:2026-08-21