Hive:解析管道分隔的数据,该数据也包含转义字符和其他特殊字符

时间:2017-11-24 14:57:31

标签: hadoop hive hiveql

我正在尝试从text文件解析并将以下数据加载到Hive外部表中。

实施例。数据:

 "100'082 \"|"ABC~01"|"Mana|ger1 \"|"ABC01@m'a`il.com" 

使用以下查询:

create external table test3
(EmpID STRING, 
EmpName STRING, 
Designation STRING, 
Email STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' 
WITH SERDEPROPERTIES  ('field.delim'='"|"')
STORED AS TEXTFILE
location '/home/hdp/samplefiles'
tblproperties ('skip.header.line.count'='1');

数据已作为

加载到表中
| "100'082 \   | ABC~01         | Mana|ger1 \        | ABC01@m"a`il.com"  |

但我想要这样的数据

| 100'082 \   | ABC~01         | Mana|ger1 \        | ABC01@m"a`il.com  |

在column1的开头和column4的末尾没有双引号

1 个答案:

答案 0 :(得分:0)

使用Open OpenCsvSerde代替MultiDelimitSerDe。使用以下查询,它将在问题中按预期工作。

CREATE EXTERNAL TABLE test3 (EmpID STRING, 
EmpName STRING, 
Designation STRING, 
Email STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES('separatorChar' = '|\|"|\||"\|"|"','quoteChar'= '\"','escapeChar'= '\,')
STORED AS TEXTFILE LOCATION '/home/hdp/samplefiles'
tblproperties ('skip.header.line.count'='1');

选择查询的结果将是:

hive> select * from test3;
OK
100'082 \       ABC~01  Mana|ger1 \     ABC01@m'a`il.com