Amazon Athena 新しくサポートされた OpenCSVSerDeを使ってみた

2017.02.28

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

待望の OpenCSVSerDeが新たにサポートされましたので早速使ってみました。OpenCSVSerDeを利用することで引用符で囲まれた列のデータの取り出しが可能になります。

OpenCSVSerDeとは

最初に「SerDe」とは、Serialize/Deserializeの略で、あらゆるデータを入出力できる形式に変換するためのインタフェースを提供します。そのインタフェースを継承したクラスの一つがOpenCSVSerDeです。

例えば、以下のようなCSVファイルあった場合、LazySimpleSerDeでは、列データに引用符が含まれてしまいます。

"a1","a2","a3","a4"
"1","2","abc","def"
"a","a1","abc3","ab4"

そこで登場したのが、本日ご紹介するOpenCSVSerDeです。OpenCSVSerDeは、CSVファイルのすべての列が引用符で括られたデータのデシリアライズに用いられます。「区切り文字」「引用符」「エスケープ文字」を指定して、引用符で囲まれた文字列を取り出すことできます。 但し、引用符で括られた表のすべての列はSTRINGデータ型になるので、問合せで使用可能な演算子が制限されます。さらに、埋め込み改行はサポートされていません。

なお、以下のようにすべての列が引用符で括られないCSVファイルの場合はむしろ LazySimpleSerDe の方を用いるのが一般的です。

1,a1,a2,33
2,b1,b2,33
3,c1,c2,33

OpenCSVSerDe によるテーブル定義

先程、例に上げたファイルを OpenCSVSerDe を使ってテーブルを定義します。LazySimpleSerDeとの大きな違いは全てSTRINGデータ型になることです。また、「区切り文字」「引用符」「エスケープ文字」を指定します。

CREATE EXTERNAL TABLE myopencsvtable (
col1 string,
col2 string,
col3 string,
col4 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\\'
)
STORED AS TEXTFILE
LOCATION 's3://xxxxxxxx/mycsv/';

クエリー結果

クエリーを実行すると引用符を含まないカラムデータの取得が成功しました。
20170228-opencsv-serde

なぜ、OpenCSVSerDeのサポートが嬉しいのか?

Athenaのクエリー結果はS3にCSVファイル形式で自動的に保存されますが、そのCSVファイル形式はOpenCSVSerDeのファイル形式となります。つまり、これを応用するとAthenaのクエリー結果で得られたS3ファイルに対して更にクエリーを実行することが可能になるからです。(限定的ではありますが...)

最後に

現在、Athenaは更新系のクエリーをサポートしていませんが、OpenCSVSerDeの登場によってRedshiftにロードするデータの加工などにも応用が期待できそうです。