如果数据中存在分隔符本身,如何将数据加载到 Hive 表中?



>我正在将数据加载到数据本身包含逗号的hive表中。

input file:emp.csv 
101,deepak,kumar,das
102,sumita,kumari,das
103,rajesh kumar das
output :
id  name
101 deepak kumar das
102 sumita kumari das
103 rajesh kumar das

当我创建下面的 hive 表并加载数据时,数据无法正确获取:

create external table hive_test(
id int, name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
STORED AS TEXTFILE
LOCATION '/hive_demo';
load data local inpath '/home/cloudera/hadoop/hive_demo/emp.csv' overwrite into table hive_test;
hive> select * from hive_test;
101 deepak
102 sumita
103 rajesh kumar das

所以我在下表下创建了,但它给出了错误。

create external table hive_test1(
id int,
name string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES(
"separatorChar" = ",",
"quoteChar" = "'",
"escapeChar" = ",")
STORED AS TEXTFILE
LOCATION '/hive_demo';
load data local inpath '/home/cloudera/hadoop/hive_demo/emp.csv' overwrite into table hive_test1;
select * from hive_test1;
Failed with exception 
java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: 
java.lang.UnsupportedOperationException: The separator, quote, and escape characters must be different!

如何将数据加载到 Hive 表?

提供以下解决方案,假设:

  • 您始终只需要从 csv 中提取 2 个列。
  • 第一个列
  • 是数字,第二个列延伸到第一个","字符之后的行尾。
  • 您需要将列中的任何","字符替换为空格name

使用 RegexSerDe 定义表和加载

create external table hive_test(
id int, name string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^(d+),(.*)$" -- 2 regex groups as per assumption
)
STORED AS TEXTFILE;
LOCATION '/path/to/table';
LOAD data local inpath '/path/to/local/csv' overwrite into table hive_test;

name列中的","替换为空格

create table hive_test1 as 
select id,regexp_replace(name, ',', ' ')as name
from hive_test;

然后,在select * from hive_test1上,您将获得以下内容:

101迪帕克·库马尔·达斯 102住田·库

马里·达斯 103拉杰什·库马尔·达斯

最新更新