如何导出带表头的Hive表数据至CSV文件?
如何导出带表头的Hive表数据至CSV文件?
我目前用这个脚本导出Hive数据到CSV:
#!/bin/bash hive -e "insert overwrite local directory '/tmp/' row format delimited fields terminated by ',' select * from Mydatabase.Mytable limit 10" > /tmp/table.csv
执行后在/tmp/下得到的CSV内容示例如下:
2017-07-04 12:58:05.0,MB0_CLI_2,29353,0982,SAIE,MNIT-BM,-,-
2017-07-04 12:56:07.0,MBUD00_CLI_2,629353,662982,SAE,MBEINIT-BM,-,-
2017-07-04 12:56:46.0,MBUDLI_2,618,65530,SAISIE,MBUIT...
但这个文件没有表头,请问怎么导出带表头的Hive表数据到CSV文件?
这是个很常见的需求,我给你分享几种实用的解决方法,你可以根据自己的Hive版本和场景选择:
方法一:自动获取表头并拼接数据
这种方法不需要手动写字段名,适合字段较多的表:
- 先通过Hive的
desc命令提取表头,写入CSV文件:
hive -e "desc Mydatabase.Mytable;" | awk -F '\t' 'NR>1 && $1 !~ /^#/ {print $1}' | tr '\n' ',' | sed 's/,$/\n/' > /tmp/table.csv
简单解释下每个步骤:
desc Mydatabase.Mytable输出表的字段元信息awk过滤掉首行的描述信息和注释行,只保留字段名tr把每个字段名后的换行换成逗号,sed去掉最后一个多余的逗号并换行,生成标准的表头行
- 再把表的数据追加到这个文件里:
hive -e "select * from Mydatabase.Mytable limit 10" | sed 's/[\t]/,/g' >> /tmp/table.csv
顺便提一句,你原来用insert overwrite local directory的方式其实会在/tmp下生成多个类似000000_0的分片文件,你重定向得到的table.csv其实是Hive的运行日志,不是实际的数据文件,这个方法能避免这个问题。
方法二:手动定义表头并合并数据
如果你的表字段不多,或者需要自定义表头名称,可以用union all先输出表头行,再拼接数据:
hive -e "select '时间','客户端ID','数值1','数值2','标识1','标识2','预留字段1','预留字段2' union all select * from Mydatabase.Mytable limit 10" | sed 's/[\t]/,/g' > /tmp/table.csv
注意这里的字符串要和表的字段数量完全对应,你可以把这些字符串换成更易懂的业务名称,比默认字段名更友好。
方法三:用Hive CLI的原生参数(Hive 0.11+)
如果你的Hive版本是0.11及以上,直接用内置参数就能一步搞定,最省心:
hive --showHeader=true --outputformat=csv2 -e "select * from Mydatabase.Mytable limit 10" > /tmp/table.csv
--showHeader=true开启查询结果的表头显示--outputformat=csv2指定输出格式为逗号分隔的CSV,不用再手动替换分隔符
这个方法最简洁,但要确认你的Hive版本支持这两个参数。
内容的提问来源于stack exchange,提问作者HISI
相关产品推荐
相关产品推荐

