🎏

Snowflake で Kinesis Data Firehose の一行に連なった形式の JSON が読み込めるようになっていた件

2023/09/05に公開

業務で Kinesis Data Firehose から配信される特殊な形式の JSON ファイルを Snowflake にロードするための検証をもろもろ行っていました。が、なんと特段前処理を施すことなくよしなにパースしてくれましたので、備忘として残します。

前提

Kinesis Data Firehose の Delivery Stream からストリームデータを 1 つのファイルにまとめて S3 バケットへ put できます。しかしながら、デフォルト設定では下記のように JSON データが 1 行に繋がった形式となります。

{"timestamp": "2023-09-05T10:00:00","value": 42,"description": "サンプルデータ1"}{"timestamp": "2023-09-05T10:15:00","value": 56,"description": "サンプルデータ2"}{"timestamp": "2023-09-05T10:30:00","value": 38,"description": "サンプルデータ3"}{"timestamp": "2023-09-05T10:45:00","value": 73,"description": "サンプルデータ4"}

Snowflake ドキュメントによると、ファイルフォーマットの JSON は次の形式をサポートしているとのことでした。

ファイルからテーブルにデータをロードするとき、Snowflake は NDJSON (「改行区切り JSON」)標準形式とコンマ区切りの JSON 形式の いずれか をサポートします。

したがって、Snowflake へロードを行うには lambda 関数などを使って事前に JSON Lines 形式へ変換することが必要となります。

しかし!

なんかロードできたわ

変換前後のロード結果の比較するべく、まずはデフォルトの形式でステージへロードしてみました。
(本記事では上記のサンプル JSON を読み込むこととします)

create or replace file format file_json
    type = 'JSON'
    compression = 'AUTO';

create or replace stage json_stage
  file_format = file_json;

put file:///path/to/firehose_test.gz @json_stage;

select * from @json_stage/firehose_test.gz;

結果を確認すると 4 行で返ってきた!

Alt text

ドキュメントには JSON Lines やコンマ区切りのいずれかのみ対応と書かれているが、どういうことだろう 🤔

サポートへ確認

上記の事象について、Snowflake のサポートへファイルフォーマットのサポート状況について質問してみました。

しばらくすると下記の回答が。

改行ない JSON ファイルをサポートしていることを確認いたしました。

これは激アツ!

合わせてドキュメントの記載に関しても修正いただけるとの返答をいただきました。本当にサポートの皆さんにはいつもお世話になっております…ありがとうございます 🙏

さいごに

これまでは前処理を施す必要があっただけに、このサポートによって Kinesis Data Firehose との親和性が高まり、継続取込みパイプライン実現のハードルも低くなりそうですね。嬉しい!

参考

https://dev.classmethod.jp/articles/convert-records-in-json-format-from-kinesis-data-firehose-to-json-lines-format-and-output-them-nodejs/

https://docs.snowflake.com/ja/sql-reference/sql/create-file-format#required-parameters

Discussion