はじめに
本記事では、アドベントカレンダーの一環として、Snowflake の UDF(User-Defined Function)を活用し、データベース内で高速にスコアリングを実行する方法を紹介します。
通常、Snowflakeのデータを使ってDataikuで予測するとき
Snowflake → Dataikuへデータ取得 → 予測 → Snowflakeへ書き戻し
という往復が必要です。
しかしSnowflakeのUDFを活用することによって予測処理がSnowflake内部で完結するので、
Dataikuへのデータの転送がなくなり高速に予測値を出すことができます。
Dataikuとは?
Dataiku(データイク)とは、企業がデータ分析から生成AIまで、日常業務にAIを組み込むための技術、チーム、業務を統合するユニバーサルAIプラットフォームです。ノーコードとフルコードの両方に対応した使いやすいUIを提供し、部門を超えたコラボレーションを促進することで、スキル向上やプロジェクトの高度化を実現します。また、クラウドやローカルのさまざまなデータを一元的に扱え、環境を選ばずデータ活用ができる柔軟性が特徴です。さらに、全社の分析プロジェクトを統合・管理することで、コストやリソースを最適化し、強固なガバナンスのもと、効率的なデータ活用を可能にします。

SnowflakeのUDFとは?
SnowflakeのUDFとは、SQLで表現しにくい処理を、ユーザーが独自に関数として定義し、Snowflake内で実行できる仕組みです。
SQLでは、集計やデータの結合などを簡単に行うことができますが、機械学習で作成したモデルから予測値を算出したりなどの計算が行えなかったりします。そこでUDFを使用することで独自の関数を定義し、機械学習のモデルから予測値を算出することができたりします
手順
最初に、UDFを格納するためのステージをSnowflake上に作成します。
事前にDatabase、Schemaについては作成していました。

次にSnowflakeのコネクションを作成します。
作成方法については、以下の弊社のブログをご参照ください。
https://www.keywalker.co.jp/blog/dataiku-snowflake.html
コネクション設定時に、[Use Java UDF]にチェックを入れます。チェックを入れると、[Stage for Java UDF]と[Path in stage]の項目がでてくるので、[Stage for Java UDF]には先ほど作成したステージ名、[Path in stage]には任意の名前を入力します。([Path in stage]についてはステージ内のサブパスのようなもので、事前に準備しておく必要がない)

事前準備が完了しましたら、Dataiku上でフロー・モデルを構築します。構築したデータはSnowflakeのデータを使用しています。

スコアリングレシピに遷移し、実行エンジンを確認すると他のレシピにはない[In Database (Snowflake with Java UDF)]というエンジンを選択することができます。こちらを選ぶと構築したモデルがSnowflake内のUDFとして予測値算出してくれるようになります。

性能評価
エンジン変更前のDSS stream(single-thread)で実行したときと、UDFを使用したときでかかった時間は以下になりました。
| レコード数 | DSS Single thread(second) | UDF(second) |
| 65389 | 18 | 15 |
| 130778 | 31 | 15 |
| 261556 | 52 | 15 |
6万行の時は、あまり時間は変わらなかったですが、26万行まで増やしたときは明らかに違いが生じました。
これはデータ量が増えることによって転送時間が増えるので、DSSエンジンでの予測ではデータ量が増えるごとに時間がかかっていますが、UDFであれば転送時間が必要でなくなるため、短い時間で予測値を算出することができます。
上記はあくまで一例であり、タスクや扱うデータによって差はあるかと思いますが、より膨大なSnowflakeのデータに対して予測値を算出したい場合は、UDFを使用することをお勧めいたします。
最後に
今回はSnowflake の UDF(User-Defined Function)を活用し、データベース内で高速にスコアリングを実行する方法を紹介しました。DataikuとSnowflakeをお使いのユーザー様には、非常に便利な機能になっておりますので、ご参考にいただけますと幸いです。