0

CSV 文件包含以下混乱格式的用户调查,并包含许多不同的数据类型,如字符串、整数、范围。

中国, 20-30, 男, xxxxx, yyyyy, 移动开发者;zzzz-vvvv;“40,000-50,000 美元”,咨询

日本, 30-40, 女, xxxxx, , 软件开发者, zzzz-vvvv; “40,000-50,000 美元”,开发

. . . . .

下面的代码用于将 CSV 文件转换为 Hive 表,每列正确分配了各自的值。

add jar /home/cloudera/Desktop/project/csv-serde-1.1.2.jar;
drop table if exists 2016table;

create external table 2016table
(
  Country string,
  Age string,
  Gender string,
  Random1 string,
  Random2 string,
  Occupation string,
  Random3 string,
  Salary string,
  Industry string,
 )

 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
 WITH SERDEPROPERTIES (
  "separatorChar" = ",",
  "quoteChar"     = "\"",
  "escapeChar"    = "\\"
 )     
 STORED AS TEXTFILE;

 LOAD DATA LOCAL INPATH "/home/cloudera/survey/2016edited.csv" INTO TABLE 2016table;

这段代码运行良好,每一列都分别分配了它们的值。所有选择查询都会给出真实的结果。

现在,当尝试从具有较少列的上表(“2016table”)创建另一个表(“2016sort”)时,值在不同的列中混合在一起。

用于此的代码

DROP TABLE IF EXISTS 2016sort;

CREATE EXTERNAL TABLE 2016sort (
 country1 string,
 age1 string,
 gender1 string,
 occupation1 string,
 salary1 string,
)

 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
 WITH SERDEPROPERTIES (
 "separatorChar" = ",",
 "quoteChar"     = "\"",
 "escapeChar"    = "\\" 
)     
STORED AS TEXTFILE;

insert into table 2016sort select country,age,gender,occupation,salary from 2016table;

但是这段代码弄乱了值。SELECT gender1 from 2016sort 给出性别列的混合值以及其他列的值。

谁能帮我弄清楚缺少什么!

4

1 回答 1

0

您不需要使用 csv serde 来创建“2016sort”。因为,它没有从 .csv 文件中加载。您通过读取第一个“2016table”来插入它,该“2016table”已经使用 csv serde 从 .csv 文件加载自身。

并且从“2016table”查询,将给出纯文本而不是引用形式。

于 2019-08-30T04:44:23.263 回答