web-dev-qa-db-ja.com

NULL値を含む引用符付きCSVをAmazon Athenaに読み込む方法

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(実際のデータははるかに複雑なので引用が重要です)を読み込むために任意の方法がありますか?

10
Mikolaj

これらのデータをすばやく簡単に処理する方法:

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
;
_

enter image description here

注:RegexSerDeTBLPROPERTIES ('skip.header.line.count'='1')で適切に機能しないようでした。これは、AthenaまたはSerDeで使用される Hiveバージョン が原因である可能性があります。あなたの場合、おそらく_ID IS NULL_の行を除外することができます。

さらに読む:

Stackoverflow-Hiveにデータをロード中にフィールドから周囲の引用符を削除

アテナ-CSVを処理するためのOpenCSVSerDe

5
Zerodf