我有一大组gzip文件需要加载到配置单元中。列是字符串,用双引号封装,并用插入符号分隔( ^
). 有一些 null
数据集中编码为 \N
,例如。
"Doug Cutting"^"Hadoop"^"United States"
"Hadley Wickham"^"R"^"New Zealand"
"Alex Woolford"^\N^"United Kingdom"
在我看来,数据集看起来像一个csv(或“^sv”),因此我使用opencsvserde创建了一个表:
CREATE TABLE `technologists`(
`name` string,
`famous_for` string,
`country_of_birth` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'quoteChar'='\"',
'separatorChar'='^')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'/some/hdfs/location'
这很有效,除了 null
显示为“n”的值,例如。
hive> select * from technologists;
OK
Doug Cutting Hadoop United States
Hadley Wickham R New Zealand
Alex Woolford N United Kingdom
你知道有没有一种简单的方法来创建这个表,而不必编写自定义的serde或编辑文件?regexserde可以替换 \N
带着一个真正的 null
?
1条答案
按热度按时间nimxete21#
看起来这个serde使用反斜杠作为默认转义字符,因此
\N
被剥离成N
. 将“escapechar”添加到serde属性,并将其设置为反斜杠以外的其他值。如果可能的话,我会尝试将其设置为与quotechar值(双引号)相同的值。如果serde抱怨它是不允许的,那么可以使用一些不可打印的字符来代替。