Amazon Redshift 新たにカラムナファイルフォーマット(Parquet、ORC)からのデータロードに対応しました

2018.05.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Amazon Redshift は、新たにカラムナファイルフォーマットであるParquetORCからデータロードが可能になりました。クラスタバージョン1.0.2369は、本日東京リージョンで利用可能になりましたので早速検証してみます。

データのロードの例

Parquet 形式のデータはformat as parquet、ORC 形式のデータはformat as orcとオプション指定します。下記は、Parquet 形式のデータの例です。

copy listing 
from 's3://mybucket/data/listings/parquet/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as parquet;

データのロード

では、実際にParquet、ORCのファイルをロードしてみます。データはAWSが公開しているサンプルデータファイルを用いて検証します。

Parquet 形式の列指向データを使用したデータのロード

cmdb=# CREATE TABLE elb_parquet(
cmdb(#   request_timestamp varchar(128),
cmdb(#   elb_name varchar(128),
cmdb(#   request_ip varchar(128),
cmdb(#   request_port int,
cmdb(#   backend_ip varchar(128),
cmdb(#   backend_port int,
cmdb(#   request_processing_time double precision,
cmdb(#   backend_processing_time double precision,
cmdb(#   client_response_time double precision,
cmdb(#   elb_response_code varchar(128),
cmdb(#   backend_response_code varchar(128),
cmdb(#   received_bytes bigint,
cmdb(#   sent_bytes bigint,
cmdb(#   request_verb varchar(128),
cmdb(#   url varchar(128),
cmdb(#   protocol varchar(128),
cmdb(#   user_agent varchar(1024),
cmdb(#   ssl_cipher varchar(128),
cmdb(#   ssl_protocol varchar(128)
cmdb(# )
cmdb-# DISTSTYLE EVEN
cmdb-# SORTKEY (request_timestamp);
CREATE TABLE
Time: 176.370 ms

cmdb=# copy elb_parquet
cmdb-# from 's3://athena-examples-ap-northeast-1/elb/parquet/year=2015/month=1/day=1'
cmdb-# iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
cmdb-# format as parquet;
INFO:  Load into table 'elb_parquet' completed, 10491958 record(s) loaded successfully.
COPY
Time: 73480.061 ms

cmdb=# select count(*) from elb_parquet;
-[ RECORD 1 ]---
count | 10491958

Time: 2662.041 ms

cmdb=# select * from elb_parquet limit 1;
-[ RECORD 1 ]-----------+----------------------------------------------------------------------------------------------------------------
request_timestamp       | 2015-01-01T00:00:00.022719Z
elb_name                | elb_demo_005
request_ip              | 244.218.91.244
request_port            | 2255
backend_ip              | 172.36.231.239
backend_port            | 443
request_processing_time | 0.000878
backend_processing_time | 0.000803
client_response_time    | 0.000891
elb_response_code       | 200
backend_response_code   | 200
received_bytes          | 0
sent_bytes              | 1886
request_verb            | GET
url                     | https://www.example.com/jobs/376
protocol                | HTTP/1.1
user_agent              | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"
ssl_cipher              | DHE-RSA-AES128-SHA
ssl_protocol            | TLSv1.2

Time: 3205.028 ms

ORC 形式の列指向データを使用したデータのロード

cmdb=# CREATE TABLE elb_orc(
cmdb(#   request_timestamp varchar(128),
cmdb(#   elb_name varchar(128),
cmdb(#   request_ip varchar(128),
cmdb(#   request_port int,
cmdb(#   backend_ip varchar(128),
cmdb(#   backend_port int,
cmdb(#   request_processing_time double precision,
cmdb(#   backend_processing_time double precision,
cmdb(#   client_response_time double precision,
cmdb(#   elb_response_code varchar(128),
cmdb(#   backend_response_code varchar(128),
cmdb(#   received_bytes bigint,
cmdb(#   sent_bytes bigint,
cmdb(#   request_verb varchar(128),
cmdb(#   url varchar(128),
cmdb(#   protocol varchar(128),
cmdb(#   user_agent varchar(1024),
cmdb(#   ssl_cipher varchar(128),
cmdb(#   ssl_protocol varchar(128)
cmdb(# )
cmdb-# DISTSTYLE EVEN
cmdb-# SORTKEY (request_timestamp);
CREATE TABLE
Time: 170.317 ms

cmdb=# copy elb_orc
cmdb-# from 's3://athena-examples-ap-northeast-1/elb/orc/year=2015/month=01/day=01'
cmdb-# iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
cmdb-# format as orc;
INFO:  Load into table 'elb_orc' completed, 198313 record(s) loaded successfully.
COPY
Time: 3420.535 ms

cmdb=# select count(*) from elb_orc;
-[ RECORD 1 ]-
count | 198313

Time: 12.709 ms
cmdb=# select * from elb_orc limit 1;
-[ RECORD 1 ]-----------+------------------------------------------------------------------------------------------------------------------------
request_timestamp       | 2015-01-01T00:00:00.902953Z
elb_name                | elb_demo_007
request_ip              | 248.114.157.51
request_port            | 22272
backend_ip              | 172.46.130.226
backend_port            | 8888
request_processing_time | 0.000653
backend_processing_time | 0.000953
client_response_time    | 0.000761
elb_response_code       | 200
backend_response_code   | 200
received_bytes          | 0
sent_bytes              | 2922
request_verb            | GET
url                     | https://www.example.com/images/536
protocol                | HTTP/1.1
user_agent              | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Safari/602.1.50"
ssl_cipher              | DHE-RSA-AES128-SHA
ssl_protocol            | TLSv1.2

Time: 11.873 ms

最後に

Aamazon Redshiftは、2大カラムナファイルフォーマットである Parquet と ORCのロードをサポートしました。これらはデータの読み取りサイズを最適化し、データレイクのデータソースとして最も理想的なフォーマットのファイルです。カラムナファイルフォーマットは本来であればエスケープしなければならない文字列の取扱もシンプルになります。

これまでは、Redshiftのロード用途にはCSVファイルなどのデータを用意し、Redshift Spectrum/Athena用途にはカラムナファイルフォーマットを別に用意する必要がありました。今後はデータレイク用のカラムナファイルフォーマットのファイルに統一するという選択肢が増えたと言えるでしょう。