从数据源创建一个Hive表,其中带有插入符号分隔,引用的列和以“\ N”编码的空值

时间:2016-02-27 00:56:09

标签: hive

我有一大堆需要加载到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吗?

1 个答案:

答案 0 :(得分:1)

看起来这个serde使用反斜杠作为默认转义字符,因此\N被剥离到N。添加' escapeChar'到您的serde属性并将其设置为反斜杠以外的其他内容。如果可能的话,我尝试将其设置为与quoteChar值相同(双引号)。如果serde抱怨它不被允许,那么可能会使用一些不可打印的字符。