エラー
HIVE_BAD_DATA: Error parsing field value '' for field X: For input string: ""
Athenaでクエリを流す時に上記のエラーが出ました。
テーブル定義
テーブル作成時のエンジンは OpenCSVSerde
でダブルクォーテーションを指定して、CSVデータを処理したいです。
...
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '"',
'escapeChar' = '\\'
)
STORED AS TEXTFILE
LOCATION 's3://DOC-EXAMPLE-BUCKET/mycsv/';
解決方法
AWSのKnowlageCenterの記事に記載されています。
Why do I get the error "HIVE_BAD_DATA: Error parsing field value '' for field X: For input string: """ when I query CSV data in Amazon Athena?
一言で言うと、テーブル定義のDDLで全部のカラムを STRING
として定義すれば解消します。
原理
その理由はOpenCSVSerde
はデータを解析する時、null
でも ""
でも、なんでもいいです、とりあえず全部STRING
として取り扱ってください。こうするとエラーがならないです。
おまけ
なぜ OpenCSVSerde
を利用しますかと言われたら、今回処理したいCSVデータはCURレポートです、出力したCSVデータは一部だけカンマ「,」が入っていてダブルクォーテーションで囲まれています。OpenCSVSerde
を利用しないとこんなデータの列ずれが発生します。
要するには、一部のデータだけダブルクォーテーションで囲まれていても、OpenCSVSerde
を利用して quoteChar = '"'
を指定してもOKです、ダブルクォーテーションで囲まれていないデータへの影響がありません。
文句
AWSのCURレポートはCSVフォーマットの出力データはほんっとうに馬鹿馬鹿しいですわ。カラムは可変だし、Athenaで大文字小文字が区別できないのに、レポート中で大文字小文字で区別するカラムがあるし、カンマが入っているデータも存在するし。。。Athena整合性を有効化によってある程度が回避できますが、なんでそもそももっといい構成にしてないのか?