S3に保存された引用CSVファイルを使用して、Athenaで外部テーブルを作成しようとしています。問題は、CSVの列に欠落している値が含まれているため、INTとして読み取る必要があることです。簡単な例:
CSV:
_id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
_
テーブル定義の作成:
_CREATE EXTERNAL TABLE schema.test_null_unquoted (
id INT,
height INT,
age INT,
name STRING
)
ROW FORMAT
SERDE 'org.Apache.hadoop.Hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ",",
'quoteChar' = '"',
'skip.header.line.count' = '1'
)
STORED AS TEXTFILE
LOCATION 's3://mybucket/test_null/unquoted/'
_
_CREATE TABLE
_ステートメントは正常に実行されますが、テーブルを照会しようとするとすぐに_Hive_BAD_DATA: Error parsing field value ''
_が表示されます。
CSVを次のようにしようとしました(空の文字列を引用):
_"id","height","age","name"
1,"",26,"Adam"
2,178,28,"Robert"
_
しかし、それは機能していません。
SERDEPROPERTIES
で_'serialization.null.format' = ''
_を指定しようとしました-動作していません。
TBLPROPERTIES ('serialization.null.format'='')
で同じものを指定しようとしました-まだ何もありません。
すべての列をSTRING
として指定すると機能しますが、それは私が必要とするものではありません。
したがって、質問は、正しい列指定でAthenaに引用CSV(実際のデータははるかに複雑なので引用が重要です)を読み込むために任意の方法がありますか?
これらのデータをすばやく簡単に処理する方法:
CSV:
_id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
3,123,34,"Bill, Comma"
4,183,38,"Alex"
_
DDL:
_CREATE EXTERNAL TABLE stackoverflow.test_null_unquoted (
id INT,
height INT,
age INT,
name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' -- Or use Windows Line Endings
LOCATION 's3://XXXXXXXXXXXXX/'
TBLPROPERTIES ('skip.header.line.count'='1')
;
_
問題は、最後のフィールドの引用文字を処理していないことです。 [〜#〜] aws [〜#〜] によって提供されるドキュメントに基づいて、これは、 Hive から以下を与えられたLazySimpleSerDeとして意味をなします。
ソリューションは次のSerDe _org.Apache.hadoop.Hive.serde2.RegexSerDe
_を使用していると思われます。
後で正規表現に取り組みます。
編集:
約束どおりの正規表現:
_CREATE EXTERNAL TABLE stackoverflow.test_null_unquoted (
id INT,
height INT,
age INT,
name STRING
)
ROW FORMAT SERDE 'org.Apache.hadoop.Hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "(.*),(.*),(.*),\"(.*)\""
)
LOCATION 's3://XXXXXXXXXXXXXXX/'
TBLPROPERTIES ('skip.header.line.count'='1') -- Does not appear to work
;
_
注:RegexSerDe
はTBLPROPERTIES ('skip.header.line.count'='1')
で適切に機能しないようでした。これは、AthenaまたはSerDeで使用される Hiveバージョン が原因である可能性があります。あなたの場合、おそらく_ID IS NULL
_の行を除外することができます。
さらに読む: