👋

Snowflake Parquetファイルのロード

2022/11/02に公開

前回はJSONファイルのロードを紹介しましたが今回はParquetファイルです。

Parquetファイルとは?

Apache Parquetは、効率的なデータの保存と検索のために設計された、
オープンソースの列指向データファイル形式です。
複雑なデータを一括処理するための効率的なデータ圧縮と符号化方式を提供し、
パフォーマンスを向上させます。

Parpuetのロード

準備

まずはロードするための準備を行います。

Parquetフォーマットファイルの作成
CREATE OR REPLACE FILE FORMAT MANAGE_DB.FILE_FORMATS.PARQUET_FORMAT
    TYPE = 'parquet';
外部ステージ作成
CREATE OR REPLACE STAGE MANAGE_DB.EXTERNAL_STAGES.PARQUETSTAGE
    url = 's3://snowflakeparquetdemo'   
    FILE_FORMAT = MANAGE_DB.FILE_FORMATS.PARQUET_FORMAT;

Parquetのファイルの中身を確認してみる

SELECT * FROM @MANAGE_DB.EXTERNAL_STAGES.PARQUETSTAGE;


見た感じJSONに似たキーとバリューの関係性を持ったファイルっぽいです。

いくつかの問題

問題①:カラム名がスマートでない
問題②:フィールド内のダブルクォーテーションが邪魔
問題③:日付がおかしい
などなど

それらの問題を修正しスマートに表示する

SELECT 
$1:__index_level_0__::int as index_level,
$1:cat_id::VARCHAR(50) as category,
DATE($1:date::int ) as Date,
$1:"dept_id"::VARCHAR(50) as Dept_ID,
$1:"id"::VARCHAR(50) as ID,
$1:"item_id"::VARCHAR(50) as Item_ID,
$1:"state_id"::VARCHAR(50) as State_ID,
$1:"store_id"::VARCHAR(50) as Store_ID,
$1:"value"::int as value
FROM @MANAGE_DB.EXTERNAL_STAGES.PARQUETSTAGE;

Parquetデータのロード

テーブルの作成

CREATE OR REPLACE TABLE OUR_FIRST_DB.PUBLIC.PARQUET_DATA (
    ROW_NUMBER int,
    index_level int,
    cat_id VARCHAR(50),
    date date,
    dept_id VARCHAR(50),
    id VARCHAR(50),
    item_id VARCHAR(50),
    state_id VARCHAR(50),
    store_id VARCHAR(50),
    value int,
    Load_date timestamp default TO_TIMESTAMP_NTZ(current_timestamp))

データのロード

COPY INTO OUR_FIRST_DB.PUBLIC.PARQUET_DATA
    FROM (SELECT 
            METADATA$FILE_ROW_NUMBER,
            $1:__index_level_0__::int,
            $1:cat_id::VARCHAR(50),
            DATE($1:date::int ),
            $1:"dept_id"::VARCHAR(50),
            $1:"id"::VARCHAR(50),
            $1:"item_id"::VARCHAR(50),
            $1:"state_id"::VARCHAR(50),
            $1:"store_id"::VARCHAR(50),
            $1:"value"::int,
            TO_TIMESTAMP_NTZ(current_timestamp)
        FROM @MANAGE_DB.EXTERNAL_STAGES.PARQUETSTAGE);

テーブルの確認

SELECT * FROM OUR_FIRST_DB.PUBLIC.PARQUET_DATA;

Discussion