Amazon Athena
ユーザーガイド

CSV を処理するための OpenCSVSerDe

Athena で CSV ファイルからテーブルを作成する場合、テーブルに含まれる値のタイプを判断します。

  • ファイルに含まれる値が二重引用符で囲まれている場合は、Athena で OpenCSV SerDe を使用して値を逆シリアル化できます。次のセクションでは、STRING タイプでのこの SerDe の動作に注目してください。

  • ファイルが含まれる値が二重引用符 (") で囲まれていない場合は、どの SerDe も指定する必要がありません。この場合、Athena はデフォルトの LazySimpleSerDe を使用します。詳細については、「CSV、TSV、およびカスタム区切りファイルの LazySimpleSerDe」を参照してください。

CSV SerDe (OpenCSVSerde)

この OpenCSV SerDe は、以下のように動作します。

  • すべての列タイプ値を STRING に変換します。

  • STRING 以外のデータ型を認識する場合は、Presto パーサーに依存し、値を STRING からそれらのデータ型 (認識できる場合) に変換します。

  • デフルルトの引用文字は二重引用符 ('') を使用し、区切り文字、引用符、およびエスケープ文字を指定できます。

    WITH SERDEPROPERTIES ("separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" )
  • \t または \n を直接エスケープすることはできません。それらをエスケープするには、"escapeChar" = "\\" を使用します。このトピックの例を参照してください。

  • CSV ファイルの埋め込み改行はサポートしません。

注記

OpenCSVSerde で Athena を使用すると、SerDe はすべての列タイプを STRING に変換します。次に、Athena のパーサーは、STRING が見つけたものに基づいて、その値を実際のタイプに解析します。たとえば、値を識別できた場合は、BOOLEANBIGINTINT、および DOUBLE の各データ型に解析します。値が UNIX 形式の TIMESTAMP にある場合、Athenaはそれらを TIMESTAMP として解析します。値が Hive 形式の TIMESTAMP にある場合、Athenaはそれらを INT として解析します。DATE 型の値も INT として解析されます。

テーブル内の列を希望の型にさらに変換するには、テーブル上にビューを作成し、CAST を使用して目的の型に変換します。

STRING 以外の データ型の場合、Athena のパーサーがそれらを認識できるとき、この SerDe は次のように動作します。

  • BOOLEANBIGINTINT、および DOUBLE の各データ型を認識し、これらを変更なしで解析します。

  • TIMESTAMP 型が yyyy-mm-dd hh:mm:ss[.f...] などの UNIX 形式で指定されている場合、これを LONG 型として認識します。

  • TIMESTAMP の JDBC 準拠の java.sql.Timestamp 形式 ("YYYY-MM-DD HH:MM:SS.fffffffff" などの小数点以下 9 桁の精度) はサポートされていません。Hive の CSV ファイルを処理する場合は、TIMESTAMP の UNIX 形式を使用します。

  • DATE 型が YYYY-MM-DD などの UNIX 形式で指定されている場合、これを LONG 型として認識します。

  • DATE の別の形式はサポートされていません。Hive の CSV ファイルを処理する場合は、DATE の UNIX 形式を使用します。

例: \t または \n をエスケープ

次のテストデータの場合を考えます。

" \\t\\t\\n 123 \\t\\t\\n ",abc " 456 ",xyz

次のステートメントは Athena にテーブルを作成し、"escapeChar" = "\\" を指定します。

CREATE EXTERNAL TABLE test1 ( f1 string, s2 string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("separatorChar" = ",", "escapeChar" = "\\") LOCATION 's3://user-test-region/dataset/test1/'

次に、以下のクエリを実行します。

select * from test1;

この結果は、\t または \n を正しくエスケープして返されます。

f1 s2 \t\t\n 123 \t\t\n abc 456 xyz

SerDe 名

CSV SerDe

ライブラリ名

この SerDe を使用するには、完全修飾クラス名を ROW FORMAT で指定します。また、次に示すように、SERDEPROPERTIES 内に区切り記号を指定します。

... ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" )

次の例では、ソース CSV ファイルが s3://mybucket/mycsv/ に保存されており、データコンテンツが以下のとおりであるとします。

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

CREATE TABLE ステートメントを使用して、この CSV ファイルに基づく Athena テーブルを作成し、OpenCSVSerDe クラスを ROW FORMAT で参照します。また、文字の区切り記号、引用符文字、およびエスケープ文字の SerDe プロパティを指定します。

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://location/of/csv/';

テーブル内のすべての値に対してクエリを実行します。

SELECT * FROM myopencsvtable;

クエリは次の値を返します。

col1 col2 col3 col4 ----------------------------- a1 a2 a3 a4 1 2 abc def a a1 abc3 ab4

注記

フライトテーブルのデータは、米国 Department of Transportation、Bureau of Transportation Statistics が提供する Flights に基づいています。オリジナルからの不飽和。

このページの内容: