Hive中的CSV Serde格式,用于表中的不同值类型

时间:2018-02-08 21:35:09

标签: hadoop hive hive-serde

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

  

中国,20-30岁,男,xxxxx,yyyyy,移动开发者; ZZZZ-VVVV; " $ 40,000-50,000",咨询

     

Japan,30-40,Female,xxxxx ,, Software Developer,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;

此代码工作正常,每列都分别与其值分配。所有选择查询都会给出真实结果。

现在,当尝试从上表(" 2016表")中创建另一个表(" 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给出性别列的混合值以及其他列的值。

任何人都可以帮我找出遗漏的东西!

1 个答案:

答案 0 :(得分:0)

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

并从'2016table'查询,将得到纯文本,而不是引号形式。