Amazon Athena 新しくサポートされた OpenCSVSerDeを使ってみた
待望の 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にロードするデータの加工などにも応用が期待できそうです。