我正在尝试使用存储在S3上的引用CSV文件在Athena中创建外部表.问题是,我的CSV包含应该作为INT读取的列中的缺失值.简单的例子:
CSV:
id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
Run Code Online (Sandbox Code Playgroud)
创建表定义:
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/'
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE语句运行正常,但一旦我尝试查询表,我就得到了HIVE_BAD_DATA: Error parsing field value ''.
我试着让CSV看起来像这样(引用空字符串):
"id","height","age","name"
1,"",26,"Adam"
2,178,28,"Robert"
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
试图指定'serialization.null.format' = ''的SERDEPROPERTIES-不工作.
尝试指定相同的通过TBLPROPERTIES ('serialization.null.format'='')- 仍然没有.
当你指定所有列时,它可以工作,STRING但这不是我需要的.
因此,问题是,是否有任何方法可以使用正确的列规范读取带引号的CSV(引用对于我的真实数据更为复杂,因为我的实际数据要复杂得多)?
处理这些数据的快捷方式:
CSV:
id,height,age,name
1,,26,"Adam"
2,178,28,"Robert"
3,123,34,"Bill, Comma"
4,183,38,"Alex"
Run Code Online (Sandbox Code Playgroud)
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')
;
Run Code Online (Sandbox Code Playgroud)
问题是它不处理最后一个字段中的引号字符。根据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
;
Run Code Online (Sandbox Code Playgroud)
注意:RegexSerDe似乎无法与一起正常使用TBLPROPERTIES ('skip.header.line.count'='1')。那可能是由于雅典娜或SerDe使用的Hive版本。就您而言,您可能只排除其中的行ID IS NULL。
进一步阅读:
Stackoverflow-在将数据加载到配置单元中的同时删除字段周围的引号
| 归档时间: |
|
| 查看次数: |
6278 次 |
| 最近记录: |