本記事は以下の検証をまとめたものになります。
先日のリリースで、Schema DetectionにJSONとCSVが対応し、データロード時にソースファイルのデータ構造の変化を自動でテーブルに反映するSchema Evolutionがプレビューになったので、この2つの機能を使って一生放置できる(と言っていいくらいの)データロードの仕組みを作ってみたいと思います。
https://docs.snowflake.com/en/release-notes/2023-06#schema-detection-for-json-and-csv-preview
スキーマ検出は、内部・外部ステージにステージングされたファイルのスキーマ(カラムやデータ型などの情報)を自動的に検出します。それを可能にする関数がINFER_SCHEMAです。また、CREATE TABLE ... USING TEMPLATEを用いることで、検出したデータ構造を元にテーブルを生成することも可能です。
https://docs.snowflake.com/ja/sql-reference/functions/infer_schema
スキーマ進化(と呼ぶことにします)は、異なるデータ構造のファイルがステージングされた場合でも、エラーで止まることなくデータを継続して取り込むことができます。データの活用の幅が広がりつつある中、ビジネスの性質によってはデータ構成が頻繁に変更されることも予想されます。この機能を有効し、データ構造の変更にあわせてスキーマを進化させることで、継続的なデータパイプラインを実現します。方法は対象テーブルに対してENABLE_SCHEMA_EVOLUTIONを有効にするだけです。
https://docs.snowflake.com/en/user-guide/data-load-schema-evolution
file1.json
s3にfile1.jsonをアップロード。
json用ファイルフォーマットを作成し、INFER_SCHEMA関数を用いてテーブル構造を自動生成。
現在のテーブル構造を確認。
外部ステージを経由して、S3のfile1.jsonを一括ロード。file1.jsonをもとに生成したテーブル構造なので特に問題なくロードされる。
10カラムを追加したfile2.jsonをs3にアップロード。
一つ目のファイルと同様にfile2.jsonを一括ロード。エラーは起きず実行される。
しかし、テーブル構造はそのまま、データを確認すると既存カラムのみのデータだけがロードされていました。
TimeTravelで時を戻します。
ここで、列を自動追加されるようにENABLE_SCHEMA_EVOLUTIONを有効にします。
※この操作にはテーブルの所有権を持つロールもしくはEVOLVE SCHEMA権限の付与されたロールが必要
再度、file2.jsonを一括ロード。エラーは起きず実行される。
テーブル構造を確認すると、、
file2.jsonにしかないカラムが自動的に追加されています。
※カラム名を見てあれ?と思いますが、詳細は記事下の注意点に記載しています。
file1とfile2のデータを一部比較すると、file1では追加されたカラムはnullで埋められています。
今度はカラムが20から15に列が欠損したケースを想定してロードを行います。
各ファイルのデータを比較すると、カラムが減少した場合もnullで埋められます。
SchemaDetectionとSchemaEvolutionを組み合わせた継続的なデータパイプラインを調査した中で、いくつか注意する点があったので、まとめておきます。
または
OWNERSHIP権限が必要。のみ
で、INSERTやSnowpipe Steramingはサポートされていない。(2023/06/17現在)また、SchemaEvolutionのドキュメントには載っていませんでしたが、カラム名の自動設定に関する挙動には注意が必要だと感じました。
本記事では、外部ステージに配置されたJSONファイルをSchema Detection(INFFURE_SCHEMA)で取得したメタデータを検出し、
create table … templateで自動生成。テーブル生成後、外部ステージに配置されたファイルの列が増減してもパイプラインを停止させることなく、自動で列(カラム)を追加するパイプラインを構築しました。
システム要件やビジネス要件が多様化し、様々なファイルが上流から流れてきます。カラムが100を超えるようなソースデータがあると、データ定義を確認して手打ちでDDLを発行するのは大変な作業ですが、Schema Detectionを用いることでソースデータにあったテーブル定義で作成できます。
また、Schema Detectionでテーブルを作れたはいいものの、上流側でカラムが増えたり減ったりするとデータパイプラインを一旦停止させて、テーブルやタスクなどを修正する必要がありました。しかし、上記のテーブルをSchema Evolutionに対応させることで、データロードのタイミングでカラムを自動で追加し継続的にロードされるようになりました。
これで、上流側とのいざこざもなくなり(減り)、よりデータ分析基盤の強化に注力できるようになるはずです。連携するデータが多かったり、データ構造が頻繁に変わるようなデータを扱う場面に遭遇した際には、ぜひSchema DetectionとSchema Evolutionを試してみてください!
INFER_SCHEMA | Snowflake Documentation
Table Schema Evolution | Snowflake Documentation
データのロードの概要 | Snowflake Documentation
CREATE TABLE | Snowflake Documentation
検証データ生成スクリプト