如何将HiveQL查询的结果输出到CSV?

AAA*_*AAA 75 database hadoop hive bigdata hiveql

我们想将Hive查询的结果放到CSV文件中.我以为命令看起来应该是这样的:

insert overwrite directory '/home/output.csv' select books from table;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它表示它已成功完成但我永远找不到该文件.如何找到此文件或者我应该以不同的方式提取数据?

谢谢!

Luk*_*eer 141

尽管可以使用INSERT OVERWRITE从Hive中获取数据,但它可能不是针对您的特定情况的最佳方法.首先让我解释一下INSERT OVERWRITE,然后我将描述我用来从Hive表中获取tsv文件的方法.

根据手册,您的查询将数据存储在HDFS的目录中.格式不是csv.

写入文件系统的数据被序列化为文本,其中列由^ A分隔,行由换行符分隔.如果任何列不是基本类型,则这些列将序列化为JSON格式.

稍微修改(添加LOCAL关键字)会将数据存储在本地目录中.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
Run Code Online (Sandbox Code Playgroud)

当我运行类似的查询时,这是输出的样子.

[lvermeer@hadoop temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug  9 09:21 000000_0
[lvermeer@hadoop temp]$ head 000000_0 
"row1""col1"1234"col3"1234FALSE
"row2""col1"5678"col3"5678TRUE
Run Code Online (Sandbox Code Playgroud)

就个人而言,我通常在命令行上通过Hive直接运行我的查询来处理这类事情,然后将其传递到本地文件中,如下所示:

hive -e 'select books from table' > /home/lvermeer/temp.tsv
Run Code Online (Sandbox Code Playgroud)

这给了我一个可以使用的制表符分隔文件.希望对你也有用.

基于这个补丁-3682,我怀疑使用Hive 0.11时有更好的解决方案,但我自己无法测试.新语法应允许以下内容.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
select books from table;
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 谢谢!!蜂巢-e方法完美无缺! (3认同)
  • 你知道插入覆盖本地和管道之间的任何性能差异,在它可以成为一个问题的近似卷,管道保证你会得到一个文件,因为另一种方法给我们一个目前可能需要合并的目录 (2认同)

小智 21

如果你想要一个CSV文件,那么你可以修改Lukas的解决方案如下(假设你在linux盒子上):

hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你.我使用的是变体,但效果很好.请注意,这将输出逗号分隔,不一定是人们认为的CSV.CSV通常具有一些格式来处理带逗号的数据(例如,使用双引号包装数据,对于带双引号的数据使用双引号).值得一提的是,添加"--hiveconf hive.cli.print.header = True"参数也会在输出中获得标题. (4认同)

小智 5

这是我发现输出 HiveQL 结果的最 csv 友好的方式。
您不需要任何 grep 或 sed 命令来格式化数据,而是 hive 支持它,只需要添加额外的 outputformat 标签。

hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv
Run Code Online (Sandbox Code Playgroud)

  • 这个需要特定版本吗?对我来说根本不起作用 `hive --outputformat=csv2 -e 'select * from bla' &gt; test.csv` 给出 -&gt; *无法识别的选项:--outputformat=csv2* on Hive 2.1.1-cdh6.3.3 (2认同)