数据本身包含逗号时,如何正确加载至Hive表?
嘿,这个问题我之前帮朋友排查过,核心就是你选的字段分隔符(逗号)和数据里的内容冲突了——Hive会把每个逗号都当成字段的分界点,结果原本属于name的deepak,kumar,das被拆成了好几个字段,和你定义的id+name两列表结构不匹配,自然显示异常。下面给你几个实用的解决办法,按需选就行:
方案1:用正则表达式分割字段(最适配你的需求,无需修改原数据)
你的需求很明确:每行第一个逗号前的内容是id,逗号后的所有内容(不管含多少逗号)都是name。这种情况用Hive的正则SerDe(序列化/反序列化器)最直接,它能按照你定义的规则拆分字段。
替换原建表语句为:
create external table hive_test( id int, name string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "(\\d+),(.*)" ) STORED AS TEXTFILE LOCATION '/hive_demo';
简单解释下正则规则:
(\\d+):匹配行首的所有数字,对应id字段,(.*):匹配第一个逗号之后的全部内容(包括里面的逗号),对应name字段
重新加载数据后,就能正确把deepak,kumar,das这类内容完整解析成一个name字段了。
方案2:预处理输入文件,替换分隔符
如果不想用正则SerDe,也可以先修改输入文件的分隔符,换成和数据内容不冲突的符号(比如竖线|、制表符\t)。
比如用Linux的sed命令快速处理emp.csv:
# 只把每行的第一个逗号替换成竖线,保留name里的逗号 sed 's/,/|/' emp.csv > emp_new.csv
然后用新的分隔符建表:
create external table hive_test( id int, name string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/hive_demo';
最后加载预处理后的emp_new.csv即可。
方案3:用OpenCSVSerDe(适合规范CSV场景)
如果后续你能调整输入数据的格式,把包含逗号的name字段用双引号包裹(比如改成101,"deepak,kumar,das"),那用Hive自带的OpenCSVSerDe会更规范,这也是处理标准CSV文件的常用方式:
create external table hive_test( id int, name string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "\"" ) STORED AS TEXTFILE LOCATION '/hive_demo';
它会自动识别被双引号包裹的字段,忽略内部的逗号分隔符。
内容的提问来源于stack exchange,提问作者deepak
相关产品推荐
相关产品推荐

