从数据源创建一个配置单元表,其中包含插入符号分隔、带引号的列,空值编码为'\n'

izkcnapc  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(243)

我有一大组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 ?

nimxete2

nimxete21#

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

相关问题