Open6

Amazon Redshift の UNLOADについて

knakazawaknakazawa

Redshiftのクエリ結果をS3に出力するための方法

Redshift ServerlessでUNLOADの検証を行う
検証項目

  • 実行方法
  • パラメータ
  • 制限
  • 権限
knakazawaknakazawa

データ準備

利用データ

データはKaggleのデータセットを利用
Amazon Reviews: Unlocked Mobile Phones

データアップロード

S3にバケットを用意

データをアップロード

スキーマ定義

AWS Glueにデータベースを作成

Amazon Athena で外部テーブルを作成

CREATE EXTERNAL TABLE IF NOT EXISTS amazon_reviews (
    `product_name` STRING,
    `brand_name` STRING,
    `price` STRING,
    `rating` STRING,
    `reviews` STRING,
    `review_votes` STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
    'separatorChar' = ',',
    'quoteChar' = '"',
    'escapeChar' = '\\'
)
STORED AS TEXTFILE
LOCATION 's3://redshift-unload-verification/'
TBLPROPERTIES ('skip.header.line.count' = '1');

Redshift Serverlessからクエリ

Workgroup, Namaspaceを作成し、クエリを実行
NamaspaceにアタッチするIAMにはS3の書き込み権限を付与する。

knakazawaknakazawa

UNLOAD の実行

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD.html

最小限

UNLOAD ('SELECT * FROM "awsdatacatalog"."redshift-unload"."amazon_reviews";')
to 's3://redshift-unload-verification/redshift/' 
IAM_ROLE default;

複数に分割されて出力された

デフォルトでは、ファイルの | 区切り、拡張子はない状態で出力される。

ファイルのフォーマットを指定

FormatにはCSV, PARQUET, JSONのどれかが利用できる。

UNLOAD ('SELECT * FROM "awsdatacatalog"."redshift-unload"."amazon_reviews";')
to 's3://redshift-unload-verification/redshift/' 
IAM_ROLE default
FORMAT AS CSV;

CSVフォーマットで出力された。

拡張子を指定

拡張子はEXTENSIONで指定できる。

UNLOAD ('SELECT * FROM "awsdatacatalog"."redshift-unload"."amazon_reviews";')
to 's3://redshift-unload-verification/redshift/' 
IAM_ROLE default
FORMAT AS CSV
EXTENSION 'csv'
knakazawaknakazawa

PARALLEL

PARALLEL を OFF にするとファイルが散らばらない。しかし、実行時間は長くなる。

UNLOAD ('SELECT * FROM "awsdatacatalog"."redshift-unload"."amazon_reviews";')
to 's3://redshift-unload-verification/redshift/' 
IAM_ROLE default
FORMAT AS CSV
PARALLEL OFF
EXTENSION 'csv'

Header, ALLOWOVERWRITE

Headerオプションを付けると、SELECT の 名前でheader が出力される。

UNLOAD ('SELECT * FROM "awsdatacatalog"."redshift-unload"."amazon_reviews";')
to 's3://redshift-unload-verification/redshift/' 
IAM_ROLE default
FORMAT AS CSV
PARALLEL OFF
ALLOWOVERWRITE
HEADER
EXTENSION 'csv'

MAXFILESIZE

MAXFILESIZEを設定すると設定値を上限として、超えた場合には複数に分割される。
5MB ~ 6.2GB までで設定可能で、MBの時の小数点以下は無視される。

UNLOAD ('SELECT * FROM "awsdatacatalog"."redshift-unload"."amazon_reviews";')
to 's3://redshift-unload-verification/redshift/' 
IAM_ROLE default
FORMAT AS CSV
PARALLEL OFF
ALLOWOVERWRITE
MAXFILESIZE 5MB
EXTENSION 'csv'

圧縮

圧縮方法を設定した場合、MAXFILESIZEと組み合わせると圧縮後のファイルサイズで分割され出力される。EXTENSIONを設定しなくても、圧縮方法の拡張子が付与されている。

UNLOAD ('SELECT * FROM "awsdatacatalog"."redshift-unload"."amazon_reviews";')
to 's3://redshift-unload-verification/redshift/' 
IAM_ROLE default
FORMAT AS CSV
PARALLEL OFF
ALLOWOVERWRITE
MAXFILESIZE 0.1GB
GZIP
EXTENSION 'gz';
knakazawaknakazawa

制約について

  • UNLOADを使用する場合、LIIMTとの併用はできない
  • 出力されるファイル数に制限をかけることはできない
  • 出力されるファイル数自体に制限はなさそう(?)だが、Redshiftの読み出し量に制約がある
knakazawaknakazawa

権限

Redshift serverlessを使用している場合、アタッチしている IAM RoleにS3への書き込みを行える権限が必要