如果分隔符本身存在于数据中,如何将数据加载到配置单元表中?

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

我正在将数据加载到配置单元表中,该表本身包含逗号。

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

当我创建下面的配置单元表并加载数据时,数据未正确传入:

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!

如何将数据加载到配置单元表?

e4yzc0pl

e4yzc0pl1#

提供以下解决方案假设:
您总是只需要从csv中提取2个col。
第一列是数字,第二列一直延伸到第一个字符后的行尾。
您需要替换中的任何“,”字符 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;

将“名称”列中的“,”替换为空格

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

然后,继续 select * from hive_test1 ,您将获得以下信息:
101迪帕克库马尔达斯
102 sumita kumari das酒店
103拉杰什·库马尔·达斯

相关问题