SnowflakeのTransform機能はどの程度か調査したい
ETL、ELTなどといったときの文脈のTransformだが 一体Snowflake側でどれほどの機能を提供しているのだろうか。
「データウェアハウスだけどTransformもちょこっと出来るよ」 なのか 「データウェアハウスだけじゃない。ETLすべてお任せあれ」 なのか。
前提
Transformの定義はwikipediaのTransformの項に委ねる
https://ja.m.wikipedia.org/wiki/Extract/Transform/Load
Snowflakeで使える手札
- Transform関数 https://docs.snowflake.com/en/sql-reference/functions/transform Transform関数はSELECT句で使えるかんじ。第1引数にarrayを取り第2引数にlambda式をとる関数で、よしなに変換できる。map関数とかに似てそう
- MERGE https://docs.snowflake.com/en/sql-reference/sql/merge MERGEはDMLのひとつ(SELECT、INSERT、などと同じ並び)。条件にMATCHしたものをCRUD出来るので特定条件だけ更新、削除などできる。Transformではこれを主に使うことになりそう。
- UDF(ユーザー定義関数) https://docs.snowflake.com/ja/developer-guide/udf/udf-overview UDF(ユーザー定義関数)はFunctionを定義できる。SELECT句で使えたり、TASKから関数呼び出しとして使えたりする。言語はPython、Java、Scala、SQLなど色々使えるのが良いっちゃ良い
- Snowpark https://www.snowflake.com/en/data-cloud/snowpark/ 機械学習とか用途のSnowparkだが、なんか上手いことやればTransformに使えるっぽい…かと思ったけどやっぱ厳しいか
- Snowflake Script https://docs.snowflake.com/en/developer-guide/snowflake-scripting/use-cases ストアドプロシージャで独自スクリプト言語が使えるっぽい。ストアドと聞くとウッとなってしまうが、色々できそうではある
TaskとStreamを組み合わせ、変更差分をUDFでTransform
Snowflakeでよく見る、Streamで差分を確認し、Taskで定期実行し差分をTransformするやり方。 この記事を書いた人が特徴的なのはUDF(ユーザー定義関数)をゴリゴリ使ってるところ https://dev.to/rnubel/transform-data-in-snowflake-with-streams-tasks-and-python-l71
Transformはdbtにすべて託すパターン
ExtractやLoadの部分はSnowflakeに任せTransformはdbtだ!という記事も見る そういう選択肢を取る人も居るらしい https://zenn.dev/dataheroes/articles/bcced35e8156ba
この記事内にも書いてあったが、Snowflakeで完結するメリットもあるといえばありそう
- コストやテーブルの変更容易性
- dbtの学習コスト、導入コストとのトレードオフ
Snowflakeをデータウェアハウスとして扱いTransformは各プロダクトでdbtで賄うパターン
Snowflakeのテーブルは使うのだが、Transformはdbtでやっているぽい。各プロダクトのチームがそれぞれ要件に合わせてdbtモデルを作ることでTransformする。プロダクト横断でdbtを使うぞ!となってる場合これで良さそう
https://techblog.cartaholdings.co.jp/entry/snowflake-data-platform-vision
その他参考
https://www.snowflake.com/guides/modern-etl-process/?amp https://www.snowflake.com/ja/guides/etl-vs-elt/?amp https://zenn.dev/circle_yukiyama/books/snowflake-zero2prod
まとめ
Transformationに絡みそうなSnowflakeの手札を調べ、 世の中でどんなふうに使われているか色々ネット記事を漁ってみた。 できることにはある程度限りはあるものの、 SnowpipeとTaskを組み合わせて流れを組めばできることは色々ありそう。 あと、TransformなのかLoadなのか微妙な位置な気がするけど Dynamic Table (https://docs.snowflake.com/en/user-guide/dynamic-tables-about)も良さそう。 結論、このSnowflakeで組めるジョブフローや機能の範囲であればSnowflakeを使う。 そうすると、Snowflakeの特徴である計算リソースがうまく並列で使えることやRole定義などの恩恵が受けれそう。 Snowflakeの提供する機能でユースケースが満たせなさそうであれば、DigdagやAirflowなどのワークフローエンジンやdbtとかでゴニョゴニョする感じだろうか
0 件のコメント:
コメントを投稿