跨服务器迁移Hive数据:CSV导入后整行仅存入首列问题
解决Hive导入CSV时整行数据塞进第一列的问题
我来帮你搞定这个问题——你遇到的情况完全是因为导出和导入时的字段分隔符不匹配导致的,具体来说:
问题根源
当你用hive -e 'select * from sample' > /home/hadoop/sample.csv导出数据时,Hive CLI默认是用制表符(Tab)来分隔字段的,但Hive表默认的字段分隔符是不可见的^A字符(也就是\001)。用load data导入时,Hive找不到匹配的分隔符,自然就把整行内容都塞进第一个字段里了。
两种可行的解决方案
方案一:导出时使用Hive默认分隔符(推荐,无需修改表结构)
直接把导出的制表符替换成Hive默认的^A分隔符,同时去掉表头避免干扰:
# 导出命令:去掉表头 + 替换分隔符 hive -e 'set hive.cli.print.header=false; select * from sample' | sed 's/\t/\x01/g' > /home/hadoop/sample.csv
然后执行你原来的导入命令就可以了:
load data local inpath '/home/hadoop/sample.csv' into table sample;
方案二:导出为标准CSV,修改表的分隔符适配
如果你更倾向于用标准CSV格式,可以先把数据转成逗号分隔,同时处理array类型字段(因为array不能直接用逗号拆分):
# 导出命令:用逗号分隔字段,array类型用|拼接元素(可换成其他不冲突的符号) hive -e 'set hive.cli.print.header=false; select concat_ws(",", cast(id as string), name, concat_ws("|", tags)) from sample' > /home/hadoop/sample.csv
然后需要确保目标表的分隔符和导出时一致(如果表已存在,需要重建或修改表结构):
-- 建表示例:指定字段分隔符为逗号,array元素分隔符为| create table sample ( id bigint, name string, tags array<string> ) row format delimited fields terminated by ',' collection items terminated by '|';
最后执行导入命令即可。
额外注意事项
- 如果你的数据本身包含逗号、|这类符号,一定要换成一个不会和数据冲突的分隔符,比如
\002(不可见字符) - 导出时必须去掉表头,否则表头行会被当成一条无效数据导入到表中
内容的提问来源于stack exchange,提问作者user6325753
相关产品推荐
相关产品推荐

