【问题标题】:how to load data into hive table if the delimiter itself present in the data?如果分隔符本身存在于数据中,如何将数据加载到配置单元表中?
【发布时间】:2018-05-04 02:15:16
【问题描述】:

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

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 映射(这不是 Hive 特有的)。选项 1:正确重建该文件,或者使用不同的分隔符,例如制表符或分号,或在文本字段周围加上引号。选项 2:使用例如修复现有文件sed 例如用另一个“分隔符”字符替换第一个冒号字符。选项 3:也许“正则表达式 serde”可以用作 Hive 中的解决方法,但恕我直言,这将是一个蹩脚的修复。

标签: hive


【解决方案1】:

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

  • 您始终只需要从 csv 中提取 2 个列。
  • 第一个 col 是数字,第二个 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;

name 列中的“,”替换为空格

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章

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多