書いたきっかけ
3月末にSnowflakeの資格取得するための自身のアウトプットの場でもあるのですが、
自分の辞書代わりや、みなさまにも共有して便利になれたら一石N鳥だと思い投稿しました。
CREATE FUNCTION
UDFを作成することが可能となっております。
以下はSnoflakeの組み込み関数を使用して、UDFを作成しております。
CREATE OR REPLACE FUNCTION DAY_NAME_ON(NUM_OF_DAYS INT)
RETURNS STRING
AS
$$
SELECT 'IN' || CAST(NUM_OF_DAYS AS STRING) || ' DAYS IT WILL BE A ' || DAYNAME(DATEADD(DAY,NUM_OF_DAYS,CURRENT_DATE()))
$$;
SELECT DAY_NAME_ON(100);
LANGUAGEを指定することで、
以下の高級言語も使用することができます。
デフォルトでは、上のクエリの通り、sqlになります。
CREATE EXTERNAL FUNCTION
もし仮に、既にAWSのLambdaなどに関数が用意されていて、それを用いりたい場合は、
これを使用します。
API GatewayなどとAPI連携することで、Snowflakeからクラウドリソースを使用することで
実行することができます。
一例をこちらに記載します
CREATE OR REPLACE API INTEGRATION DEMONSTRATION_EXTERNAL_API_INTEGRATION_01
API_PROVIDER = AWS_API_GATEWAY
-- API GATEWAY を正常に動作することができるロールを付与
API_AWS_ROLE_ARN = 'ARN'
-- エンドポイントURLを記載
API_ALLOWED_PREFIXES = ('API GATEWAY URL')
ENABLED = TRUE;
CREATE OR REPLACE EXTERNAL FUNCTION LOCAL_ECHO(STRING_COL VARCHAR)
RETURNS VARIANT
API_INTEGRATION = DEMONSTRATION_EXTERNAL_API_INTEGRATION_01
AS 'PROXY SERVICE URL'
SELECT LOCAL_ECHO('test')
メリットとして、
そのままある既存の関数を使用することができること
開発コストが少なくなる
デメリットとしては、
通信の関係で、レスポンスが遅れることです。
基本的にはUDFを使用することが推奨されていますが、
snowflakeではサポートされていない言語が使用されていることだったり、
やむを得ない場合は使用することを検討すると言ったところでしょうか。
CREATE SEQUENCE
テーブルをINSERTする際など、レコードごとに一意な値を情報として欲しい場合が
実務においてほしいタイミングがかなりあります。
その際にレコードごとにシーケンス番号をつけることができるのが、
CREATE SEQUENCEです
以下に一覧を記載します
CREATE SEQUENCE TRANSACTION_SEQ
START = 1001
INCREMENT = 1;
CREATE OR REPLACE TABLE TRANSACTIONS(
ID INTEGER DEFAULT TRANSACTION_SEQ.NEXTVAL,
AMOUNT DOUBLE
);
INSERT INTO TRANSACTIONS(AMOUNT)
VALUES(1000.0);
SELECT * FROM TRANSACTIONS;
結果は以下のようになります。
INSERTにはAMOUNTしか追加していませんが、前列取得してみると、IDに値が入っていることがわかります。
私自身、当初実務でこの機能を知らずに、あるテーブルのシーケンス番号を作成する際に、
PKキーを使用して、クエリを作成してシーケンス番号を作成していました。
CRETE TASK
日々のクエリを自動化させたい場合に、使用するSQLになります。
よく使用されるのは、COPY INTOと合わせて、データレイクからSnowflakeにロードする場面などです。
簡単な一例を作成しました。
SCHEDULEについては、cronを使用することも可能です。
CREATE TASK T1
WAREHOUSE = COMPUTE_WH
SCHEDULE = '30 MINUTE'
AS
SELECT 1;
また、DAGで定義することも可能です。
TASK3を参照すると、AFTERというものが追加されていることがわかります。
あるタスクが終了したら次のタスクを開始させることができます。
これはかなりの場面で使用されるので、とても便利です
CREATE TASK T1
WAREHOUSE = COMPUTE_WH
SCHEDULE = '30 MINUTE'
AS
SELECT 1;
CREATE TASK T2
WAREHOUSE = COMPUTE_WH
SCHEDULE = '30 MINUTE'
AS
SELECT 1;
CREATE TASK T3
WAREHOUSE = COMPUTE_WH
AFTER T1,T2
AS
SELECT 1;