首页 > 解决方案 > 如何防止 Hive Create Table 将数据中带有逗号“,”的列拆分为两列

问题描述

我使用 Sqoop 导入了 MySQL 表。某些列值中包含逗号“,”。例如,“值,ST”。我想将该值存储在同一列中,就像它在 MySQL 中的方式一样,但是当我创建 Hive 表时,“值”和“ST”存储在单独的列中。“ST”进入右列。

我试过这个

CREATE EXTERNAL TABLE IF NOT EXISTS personal_to_delete 
(id_personal string, 
no_ktp string, 
nama string, 
nama_tanpa_gelar string, 
alamat1 string, 
kodepos string, 
id_kabupaten_alamat string, 
id_propinsi string, 
npwp string, 
tgl_update string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES (
   "separatorChar" = "\",
   "quoteChar"     = ","")
FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/hadoop/personal_to_delete';

运行此查询后,我得到 Null 值。我该如何解决这个问题?

标签: mysqlhadoophivesqoop

解决方案


问题似乎是用于分隔字段的分隔符也出现在值本身中。这使得 create table 命令难以正常工作。你需要

  • 在字段中转义此字符或
  • 使用引号字符将字段括起来或
  • 使用不同的字段分隔符,它不会出现在字段本身中,以使文件在导入过程中“易于理解”。

我自己可能会采取以下两种选择之一:

  1. 正如 OneCricketeer 所建议的:让 sqoop 直接导入到配置单元表。这似乎是一个很好的例子:在此处输入链接描述
  2. 使用 sqoop 创建文件时,请尝试设置字段分隔符的选项 --fields-terminated-by。如果您将其设置为不同的内容,则使用逗号“,”(例如分号“;”或其他未出现在您的数据中的内容)并在您的配置单元创建语句中提供此信息(例如,FIELDS TERMINATED BY ';')并省略 serdeproperties它应该工作。

推荐阅读