我有一大堆需要加载到Hive的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
吗?
答案 0 :(得分:1)
看起来这个serde使用反斜杠作为默认转义字符,因此\N
被剥离到N
。添加' escapeChar'到您的serde属性并将其设置为反斜杠以外的其他内容。如果可能的话,我尝试将其设置为与quoteChar值相同(双引号)。如果serde抱怨它不被允许,那么可能会使用一些不可打印的字符。