Amazon Redshift:UNLOADコマンドでZSTDオプションが使えるようになりました

小ネタです。

Amazon Redshiftの更新履歴にて『UNLOADコマンド実行時のオプションでZSTD形式での出力が出来るようになりました』との旨、記載がありました。

当エントリでは簡潔ではありますが、当オプションについて内容を見てみたいと思います。

『Zstandard (ZSTD) エンコーディング』とは

作成したテーブルのカラムに対する列圧縮タイプの指定時

ZSTDエンコーディングそのものの内容については、AWS公式ドキュメントに簡潔にまとまっているものが有りましたのでそのまま引用します。全てのデータ型をサポートしている、比較的使い勝手の良い指定方法と言えますね。

Zstandard (ZSTD) エンコーディングは、多様なデータセット間で非常にパフォーマンスのいい高圧縮比率を提供します。ZSTD は、製品説明、ユーザーのコメント、ログ、JSON 文字列など、長さがさまざまな文字列を保存する CHAR および VARCHAR 列に対して、特に効果を発揮します。デルタ エンコードや Mostly エンコードのような一部のアルゴリズムでは非圧縮時よりも多くのストレージスペースを使用する場合があるのと異なり、ZSTD ではディスク使用量が増えることはほとんどありません。ZSTD では、Amazon Redshift のすべてのデータ型がサポートされています。

COPY処理によるデータ取り込み時の指定時

ZSTDオプション指定は、データの取り込み(COPY)を行う際にも指定が可能です。

ZSTD
入力ファイルが圧縮された Zstandard 形式 (.zst ファイル) であることを指定する値です。COPY 操作では、圧縮されたそれぞれのファイルを読み取り、ロード時にデータを解凍します。詳細については、「ZSTD」を参照してください。
注記
ZSTD は、Amazon S3 から COPY を使用する場合のみサポートされます。

UNLOAD実行時(←New!!)

そして今回新しく対応するようになったのが、データのエクスポートを行う『UNLOAD』コマンドにおける部分です。

記法について確認してみます。ZSTDオプションの記載が確認出来ますね。

UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
authorization
[ option [ ... ] ]

where option is

{ MANIFEST [ VERBOSE ] 
| HEADER

            
| [ FORMAT [AS] ] CSV
| DELIMITER [ AS ] 'delimiter-char' 
| FIXEDWIDTH [ AS ] 'fixedwidth-spec' }  
| ENCRYPTED
| BZIP2  
| GZIP 
| ZSTD
| ADDQUOTES 
| NULL [ AS ] 'null-string'
| ESCAPE
| ALLOWOVERWRITE
| PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
| MAXFILESIZE [AS] max-size [ MB | GB ] ]
| REGION [AS] 'aws-region'

まずはUNLOADコマンドの実行。ZSTDオプションを指定し、ファイルとして出力する事が出来ました。

# UNLOAD ('SELECT * FROM public.superstore_orders ORDER BY order_date, order_id;')
TO 's3://xxxxxxxxxxxxxx/yyyyyy/superstore_orders_'
IAM_ROLE 'arn:aws:iam::123456789012:role/xxxxxxxxxxxx-redshift-role'
CSV
ZSTD
PARALLEL OFF
ALLOWOVERWRITE;

INFO:  UNLOAD completed, 10000 record(s) unloaded successfully.
UNLOAD
Time: 805.001 ms

出力されたファイル存在を確認しダウンロード。

$ aws s3 ls 's3://xxxxxxxxxx/public/'
2019-04-18 xx:xx:xx     328183 superstore_orders_000.zst

$ aws s3 cp 's3://xxxxxxxxxx/public/superstore_orders_000.zst' /Users/xxxxxxxxxxxx/Desktop/superstore_orders_000.zst
download: s3://xxxxxxxxxx/public/superstore_orders_000.zst to ../Desktop/superstore_orders_000.zst

ダウンロード完了したファイルに対し、zstdコマンド実行。対象ファイルの情報を確認出来ました。

$ brew install zstd
$ zstd -l /Users/xxxxxxxxxx/Desktop/superstore_orders_000.zst 
Frames  Skips  Compressed  Uncompressed  Ratio  Check  Filename
     1      0   320.49 KB                        None  /Users/xxxxxxxxxx/Desktop/superstore_orders_000.zst

続いて、UNLOADしたzstdファイルを、『同一テーブル定義』且つ『別名』のテーブルに投入し直してみます。ZSTDオプションの指示に従い、データを連携出来ることを確認しました。

CREATE TABLE IF NOT EXISTS "public"."superstore_orders_dup"
 (
         "row_id" INTEGER NOT NULL  ENCODE lzo
         ,"order_id" VARCHAR(25) NOT NULL  ENCODE lzo
         ,"order_date" DATE NOT NULL  ENCODE delta
         ,"ship_date" DATE NOT NULL  ENCODE delta
         ,"ship_mode" VARCHAR(30) NOT NULL  ENCODE bytedict
         ,"customer_id" VARCHAR(25) NOT NULL  ENCODE lzo
         ,"customer_name" VARCHAR(100) NOT NULL  ENCODE lzo
         ,"customer_segment" VARCHAR(30) NOT NULL  ENCODE lzo
         ,"city" VARCHAR(30)   ENCODE lzo
         ,"prefecture" VARCHAR(30) NOT NULL  ENCODE lzo
         ,"nation" VARCHAR(20) NOT NULL  ENCODE lzo
         ,"region" VARCHAR(30) NOT NULL  ENCODE lzo
         ,"product_id" VARCHAR(40) NOT NULL  ENCODE lzo
         ,"product_category" VARCHAR(40) NOT NULL  ENCODE lzo
         ,"product_sub_category" VARCHAR(50) NOT NULL  ENCODE lzo
         ,"product_name" VARCHAR(200) NOT NULL  ENCODE lzo
         ,"sales" DOUBLE PRECISION   
         ,"amount" INTEGER NOT NULL  ENCODE lzo
         ,"discount_rate" DOUBLE PRECISION   
         ,"profit" DOUBLE PRECISION   
         ,PRIMARY KEY (order_date)
 )
 DISTSTYLE EVEN
 SORTKEY (
         "order_date"
         , "order_id"
         , "customer_id"
         , "product_id"
         )
 ;

CREATE TABLE
Time: 407.020 ms

# COPY public.superstore_orders_dup
FROM 's3://xxxxxxxxxx/public/superstore_orders_000.zst'
IAM_ROLE 'arn:aws:iam::123456789012:role/xxxxxxxxxxxxx-role'
CSV
ZSTD;

INFO:  Load into table 'superstore_orders_dup' completed, 10000 record(s) loaded successfully.
COPY
Time: 10397.502 ms (00:10.398)

まとめ

という訳で、Amazon RedshiftのUNLOADコマンドにおける『ZSTD』オプションが利用出来るようになった、というお知らせでした。Redshiftにおけるファイル取り回しに関する部分で、一通りの箇所で『ZSTD』オプションが使えるようになったことでデータ分析基盤の作業も効率化が図りやすくなるのではないでしょうか。