配置单元中的csv serde格式,用于表中不同的值类型

xmjla07d  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(311)

一个csv文件包含用户调查,格式混乱,包含许多不同的数据类型,如string,int,range。
中国,20-30岁,男,xx,yyyyy,手机开发者;zzzz vvv$40000-50000”,咨询
日本,30-40岁,女性,xx,软件开发人员,ZZZZVVV$40000-50000”,开发
. . . . .
下面的代码用于将csv文件转换为配置单元表,并为每列正确分配各自的值。

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;

这段代码运行良好,每一列都用它们的值分别分配。所有select查询都提供真实结果。
现在,当尝试从上表(“2016table”)创建另一个具有较少coulmns的表(“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;

但这段代码把值搞乱了。从2016sort中选择gender1,将gender列的值与其他列的值混合。
谁能帮我找出缺了什么!

kmpatx3s

kmpatx3s1#

您不需要使用csv serde来创建“2016sort”。因为,它不是从.csv文件加载的。您通过读取第一个“2016table”来插入它,该表已经使用csv serde从.csv文件加载自身。
而从“2016table”查询,则会将纯文本作为结果,而不是引用形式。

相关问题