mysql - 如何防止 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 值。我该如何解决这个问题?
解决方案
问题似乎是用于分隔字段的分隔符也出现在值本身中。这使得 create table 命令难以正常工作。你需要
- 在字段中转义此字符或
- 使用引号字符将字段括起来或
- 使用不同的字段分隔符,它不会出现在字段本身中,以使文件在导入过程中“易于理解”。
我自己可能会采取以下两种选择之一:
- 正如 OneCricketeer 所建议的:让 sqoop 直接导入到配置单元表。这似乎是一个很好的例子:在此处输入链接描述。
- 使用 sqoop 创建文件时,请尝试设置字段分隔符的选项 --fields-terminated-by。如果您将其设置为不同的内容,则使用逗号“,”(例如分号“;”或其他未出现在您的数据中的内容)并在您的配置单元创建语句中提供此信息(例如,FIELDS TERMINATED BY ';')并省略 serdeproperties它应该工作。
推荐阅读
- java - Minecraft 1.8 Forge (javaw.exe) 一直卡在 Minecraft 的主启动器应用程序 (MinecraftLauncher.exe) 中
- db2 - DB2 的数据字典
- mongoose - Mongoose create() 为带有 Array 的模式提供“Cast to Array failed for value "[object Object],[object Object]"”
- wordpress - Wordpress:引导缓存文件每隔几周就会损坏一次
- java - 获取所有用户的应用列表
- c# - 如何在一行中安全地取消订阅 Action?
- android - android.widget.LinearLayout$LayoutParams 无法转换为 androidx.constraintlayout.widget.ConstraintLayout$LayoutParams
- java - 如何使用 jaxb 正确解组转义字符
- python - 不准确和奇怪的袖扣情节
- c# - LINQ 中的用户/数据库变量