ポイント: Snowflakeにおけるユーザー定義関数(UDF)は、ユーザーがカスタムSQLおよびJavaScript関数を作成し、データ処理を強化することを可能にします。このチュートリアルでは、気象データ分析などのさまざまなアプリケーションのためにスカラーおよびテーブル関数を作成する方法を説明します。
- UDFは単一(スカラー)または複数(テーブル)の値を返すことができます。
- UDF内で複雑な計算を行うためにJavaScriptがサポートされています。
このチュートリアルでは、Snowflakeでユーザー定義関数(UDF)を作成する方法を示します。
Snowflakeでは、次のものを作成できます:
- SQLとJavaScript言語の関数
- 単一の値(スカラー)を返す関数
- 複数の値(テーブル)を返す関数
データの作成
以下のチュートリアルに従う場合は、この統計関数に関するチュートリアルの指示を使用して、Snowflakeにデータをロードしてください。データはキプロスのパフォスからの41日間の時間ごとの気象データです。
Snowflake UDF SQL関数
最初にSQLの例を示します。
以下のコードは、テーブル列mainで説明されている入力気象条件を受け取り、それを整数に変換します。これは、機械学習の一般的な問題である、カテゴリカルデータを整数に変換することを解決します。
この関数にはパラメータ(dt varchar(20))と戻り値(int)があります。残りはただのSQL選択文です。
以下のコードは、iff()およびregex()ステートメントを使用して、単語rain、cloudなどがmain列に存在するかどうかを確認します。これは1から9までの数を加算することで動作します。これらのifステートメントのうちの1つだけが真であるため、合計は1から9のいずれかの値になります。これにより、気象条件が得られます。
create or replace function weathercategorical (dt varchar(20) )
returns int
as $$select (iff(main regexp '.*Clear.*',1,0) +
iff(main regexp '.*Clouds.*',2,0) +
iff(main regexp '.*Rain.*',3,0) +
iff(main regexp '.*Thunderstorm.*', 4,0) +
iff(main regexp '.*Mist.*', 5, 0) +
iff(main regexp '.*Fog.*', 6, 0) +
iff(main regexp '.*Squall.*',7,0) +
iff(main regexp '.*Tornado.*', 8, 0) +
iff(main regexp '.*Haze.*', 9, 0))
from weather as w where w.dt = dt$$
日付と時刻はエポック時間形式です。以下のSQLステートメントは、日付2000年1月1日に対して関数weathercategoricalを呼び出し、スカラー値1を返します。これは晴れを意味します。
sselect weathercategorical (946684800) from weather where dt = 946684800
Snowflakeテーブル関数
ここでは、Snowflakeがテーブルと呼ぶ複数の値を返す方法を示します。
これらの2つのテーブルを作成します:
CREATE TABLE customers
(
customernumber varchar(100) PRIMARY KEY,
customername varchar(50),
phonenumber varchar(50),
postalcode varchar(50),
locale varchar(10),
datecreated date,
email varchar(50)
);
CREATE TABLE orders
(
customernumber varchar(100) ,
ordernumber varchar(100) PRIMARY KEY,
comments varchar(200),
orderdate date,
ordertype varchar(10),
shipdate date,
discount float,
quantity int,
productnumber varchar(50)
);
次に、このデータをコピーして貼り付けます。
スカラー関数とテーブル関数
次に、注文テーブルからレコードを取得して顧客名とメールを検索する関数を作成します。注文には顧客情報が含まれていないため、結合を行うようなものです。しかし、関数なので、顧客情報を必要とするたびに結合を作成するよりも、はるかに言葉少なく便利です。
create or replace function getcustomer (customernumber number )
returns table (customername varchar, email varchar)
as 'select customername, email from customers
where customers.customernumber = customernumber';
注文テーブルからの顧客番号を考慮すると、このステートメントは次のものを取得します:
- 顧客の名前
- 注文番号
- メール
select getcustomer (948 ), ordernumber from orders where customernumber = 948;
JavaScript UDF
ユーザー定義関数でJavaScriptを使用できます。language javascriptを指定するだけです。
Snowflakeにはその数学関数がないため、n階乗(n!)を計算しましょう。n階乗n!はn * (n-1) * (n-2) * .. ** (n - (n + 1)))です。例えば: 3!=3*2*1=6。
以下で、JavaScriptには整数型がないため、データ型としてvariantを使用します。
CREATE OR REPLACE FUNCTION factorial(n variant)
RETURNS variant
LANGUAGE JAVASCRIPT
AS '
var f=n;
for (i=n-1; i>0; i--) {
f=f*i
}
return f';
実行すると、値6が計算されます。
select factorial(3)
注意してください。33はその関数が処理できる最大の数です。33! = 8683317618811886495518194401280000000
追加リソース
このようなチュートリアルをさらに探求するには、これらのリソースを参照してください:
Snowflakeガイド
- Snowflake 101: Snowflakeデータクラウドの紹介
- Amazon S3データをSnowflakeにインポートする方法
- SnowflakeでJSONデータをクエリする方法
- S3からSnowflakeにCSVファイルをロードする
- Snowflake: 分析および統計関数の使用
- Snowflakeウィンドウ関数: パーティションと順序
- Snowflakeラグ関数と移動平均
- Snowflake SQL集計関数とテーブル結合
- Snowflakeにおけるユーザー定義関数(UDF)
- Snowflakeストリームの作成と使用
- Snowflakeでのストアドプロシージャの使用
- SnowflakeとRedshift: 違いと選び方
これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を表すものではありません。