この記事は公開されてから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/';
クエリー結果
クエリーを実行すると引用符を含まないカラムデータの取得が成功しました。
なぜ、OpenCSVSerDeのサポートが嬉しいのか?
Athenaのクエリー結果はS3にCSVファイル形式で自動的に保存されますが、そのCSVファイル形式はOpenCSVSerDeのファイル形式となります。つまり、これを応用するとAthenaのクエリー結果で得られたS3ファイルに対して更にクエリーを実行することが可能になるからです。(限定的ではありますが...)
最後に
現在、Athenaは更新系のクエリーをサポートしていませんが、OpenCSVSerDeの登場によってRedshiftにロードするデータの加工などにも応用が期待できそうです。