Snowflakeにおけるユーザー定義関数(UDF)

Snowflakeにおけるユーザー定義関数(UDF)

  • オーケストレーション
6分で読めます 更新日 Oct 27, 2020

ポイント: 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

追加リソース

このようなチュートリアルをさらに探求するには、これらのリソースを参照してください:

これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を表すものではありません。

オーケストレーションの関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。