これはなに
手元に1000個のJSONファイルがありました。ファイルサイズは全部で16GB。これを効率的に分析したくてSnowflakeに突っ込んでみた記録です。
実行環境はMacOS 14.6.1です。
おおまかな手順
- snowsqlをインストールする
- snowsqlでログイン
- ステージを作る
- ステージにファイルをアップロードする
- ステージ上のファイルからテーブルにデータを読み込む
webuiでもデータのアップロードは可能ですが一度に250MBまでしかできません。全部で16GBありますので50回以上手動のアップロードを行うのはミスもありそうですし避けたいです。そのためsnowsqlを使うことにしました。
snowsqlを使う場合、いきなりjsonファイルからテーブルを作ることはできなかったのでステージにjsonファイルを全部アップロードして、ステージ上のjsonファイルからテーブルを作っていきます。
1.snowsqlをインストールする
インストール手順は以下に記載があります。
やり方は超簡単。まずはbrewでsnowsqlをインストール。
$ brew install --cask snowflake-snowsql
次にaliasを設定。これで終わり
alias snowsql=/Applications/SnowSQL.app/Contents/MacOS/snowsql
2.snowsqlでログイン
snowsqlでログインしていきましょう。
snowsql -a {アカウント名} -u {ユーザー名} -d {データベース名} -s {スキーマ名}
ステージはスキーマないに作成されるので作成するテーブルと同じ場所を指定しました。
3.ステージを作る
以下から記載しているコマンドはsnowsqlのコマンドラインで発行するものです。
以下のクエリでステージを作ります。
CREATE OR REPLACE STAGE my_internal_stage;
4.ステージにファイルをアップロードする
ステージができたらPUTでローカルファイルをアップロードします。
PUT file://{ファイルパス}/*.jsonl @my_internal_stage;
もっとかかるかと思ったけど5分くらいで終わりました。
5.ステージ上のファイルからテーブルにデータを読み込む
Tableの定義を作るために一度WEBUIで一つだけjsonファイルを読み込んでテーブルを作りました。テーブル名はtable_from_json
として説明を続けます。
その後、テーブルの中身をすべてDELETEして、COPY INTOでデータを読み込みました。
//すべてのレコードを削除
DELETE FROM table_from_json;
//jsonを読み込むためのformatを定義
CREATE OR REPLACE FILE FORMAT my_json_format
TYPE = 'JSON'
COMPRESSION = 'AUTO';
//my_internal_logにあるjsonファイルを読み込み
COPY INTO table_from_json
FROM @my_internal_stage
FILE_FORMAT = (FORMAT_NAME = 'my_json_format')
MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;
以上で無事に1000個のjsonファイルから1つのテーブルを作ることができました。めでたしめでたし。