如何避免Hive建表时拆分Sqoop导入的含逗号数据列?
解决Hive解析含逗号字段时的拆分问题
你的问题核心是OpenCSVSerde的参数配置完全搞反了,再加上额外的字段分隔符声明和SerDe配置冲突,导致Hive无法正确解析数据,才出现了全空值的情况。我给你一步步梳理解决方案:
1. 修正Hive建表语句的核心错误
你把separatorChar(字段分隔符)和quoteChar(包裹特殊字符的引号)搞反了!而且使用OpenCSVSerde时,不需要再写FIELDS TERMINATED BY ','——因为SerDe会自行处理分隔逻辑,重复声明反而会造成冲突。正确的建表语句应该是:
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" = "\"", -- 用双引号包裹包含逗号的字段值 "escapeChar" = "\\" -- 可选:如果字段内包含双引号,用反斜杠转义 ) STORED AS TEXTFILE LOCATION '/user/hadoop/personal_to_delete';
2. 确保Sqoop导出的数据格式匹配
如果你的Sqoop导入命令没指定引号包裹规则,导出的文本里可能没有用双引号把含逗号的字段包起来,那Hive还是会拆分这些字段。所以执行Sqoop导入时,要加上以下关键参数:
sqoop import \ --connect jdbc:mysql://your-mysql-host:3306/your-db \ --username your-user \ --password your-pass \ --table personal_to_delete \ --target-dir /user/hadoop/personal_to_delete \ --fields-terminated-by ',' \ --enclosed-by '"' \ --escaped-by '\\' \ --hive-import --hive-table personal_to_delete
这里的--enclosed-by '"'会让Sqoop把含特殊字符的字段用双引号包裹,--escaped-by '\\'用来转义字段内部的双引号,避免解析时出现边界识别错误。
3. 原语句返回空值的原因
你之前的配置犯了两个致命错误:
separatorChar" = "\"":告诉Hive字段之间用双引号分隔,但你的数据实际是用逗号分隔的,Hive找不到字段边界,就把整行当成第一个字段的值,剩下的9个字段自然都是null。quoteChar" = ",":把逗号当成包裹字段的引号,完全不符合你的数据格式,进一步加剧了解析错误。
内容的提问来源于stack exchange,提问作者Shekhar
相关产品推荐
相关产品推荐

