如何将hiveql查询的结果输出到csv?

hmtdttj4  于 2021-06-03  发布在  Hadoop
关注(0)|答案(18)|浏览(599)

我们希望将配置单元查询的结果放入csv文件。我想命令应该是这样的:

insert overwrite directory '/home/output.csv' select books from table;

当我运行它,它说它成功地完成了,但我永远找不到文件。我该如何找到这个文件,还是应该以不同的方式提取数据?

nkkqxpd9

nkkqxpd91#

默认分隔符为“ ^A ". 在python语言中,它是“ \x01 ".
当我想更改分隔符时,我使用sql,例如:

SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table

然后,将分隔符+“ ^A “作为新的分隔符。

wljmcqd8

wljmcqd82#

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

hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv
2w2cym1i

2w2cym1i3#

在开始查询之后,我们将介绍以下更多步骤: INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table; 在我的例子中,temp文件夹下生成的数据在 deflate 格式,如下所示:

$ ls
000000_0.deflate  
000001_0.deflate  
000002_0.deflate  
000003_0.deflate  
000004_0.deflate  
000005_0.deflate  
000006_0.deflate  
000007_0.deflate

以下是解压deflate文件并将所有内容放入一个csv文件的命令:

hadoop fs -text "file:///home/lvermeer/temp/*" > /home/lvermeer/result.csv
91zkwejq

91zkwejq4#

如果你使用色调这是相当简单的。只需转到hue中的配置单元编辑器,执行配置单元查询,然后将结果文件本地保存为xls或csv,也可以将结果文件保存到hdfs。

fnatzsnv

fnatzsnv5#

你可以用 INSERTDIRECTORY …,如本例所示:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';
``` `OVERWRITE` 以及 `LOCAL` 具有与以前相同的解释,路径的解释遵循通常的规则。将写入一个或多个文件 `/tmp/ca_employees` ,这取决于调用的还原数。
pinkon5k

pinkon5k6#

与上面ray的回答类似,hortonworks数据平台中的HiveView2.0还允许您运行HiveQuery,然后将输出保存为csv。

wj8zmpe1

wj8zmpe17#

如果您是在windows上进行的,您可以使用python脚本hivehoney将表数据提取到本地csv文件中。
它将:
登录到堡垒主机。
跑吧。
基尼特。
直线(与你的查询)。
将echo从beeline保存到windows上的文件中。
执行如下:

set PROXY_HOST=your_bastion_host

set SERVICE_USER=you_func_user

set LINUX_USER=your_SOID

set LINUX_PWD=your_pwd

python hh.py --query_file=query.sql
x7rlezfr

x7rlezfr8#

我尝试了各种选择,但这将是最简单的解决方案之一
Python Pandas :

hive -e 'select books from table' | grep "|" ' > temp.csv

df=pd.read_csv("temp.csv",sep='|')

你也可以使用 tr "|" "," 要将“|”转换为“,”

laik7k3q

laik7k3q9#

我有一个类似的问题,这就是我如何能够解决它。
步骤1-将数据从配置单元表加载到另一个表中,如下所示

DROP TABLE IF EXISTS TestHiveTableCSV;
CREATE TABLE TestHiveTableCSV 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' AS
SELECT Column List FROM TestHiveTable;

步骤2-将blob从配置单元仓库复制到具有适当扩展名的新位置

Start-AzureStorageBlobCopy
-DestContext $destContext 
-SrcContainer "Source Container"
-SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"
oxosxuxt

oxosxuxt10#

可以使用配置单元字符串函数 CONCAT_WS( string delimiter, string str1, string str2...strn ) 例如:

hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
pkln4tw6

pkln4tw611#

hive  --outputformat=csv2 -e "select * from yourtable" > my_file.csv

hive  --outputformat=csv2 -e "select * from yourtable" > [your_path]/file_name.csv

对于tsv,只需在上述查询中将csv更改为tsv,然后运行您的查询

zsohkypk

zsohkypk12#

如果您想要一个csv文件,那么您可以修改lukas的解决方案,如下所示(假设您在linux上):

hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
ffscu2ro

ffscu2ro13#

虽然可以使用 INSERT OVERWRITE 要从配置单元中获取数据,它可能不是针对特定情况的最佳方法。首先让我解释一下 INSERT OVERWRITE 是的,那么我将描述从配置单元表获取tsv文件的方法。
根据手册,您的查询将把数据存储在hdfs的一个目录中。格式将不是csv。
写入文件系统的数据被序列化为文本,列之间用^a分隔,行之间用换行符分隔。如果任何列不是基元类型,那么这些列将序列化为json格式。
轻微的修改(添加 LOCAL 关键字)将数据存储在本地目录中。

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;

当我运行一个类似的查询时,输出是这样的。

[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

就我个人而言,我通常通过命令行上的配置单元直接运行我的查询,并将其导入本地文件,如下所示:

hive -e 'select books from table' > /home/lvermeer/temp.tsv

这给了我一个标签分隔的文件,我可以使用。希望这对你也有用。
基于这个补丁-3682,我怀疑在使用hive0.11时有更好的解决方案,但我自己无法测试。新语法应该允许以下内容。

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
select books from table;

希望有帮助。

yshpjwxd

yshpjwxd14#

我正在寻找一个类似的解决方案,但是这里提到的那些方案不起作用。我的数据有各种各样的空格(空格、换行符、制表符)字符和逗号。
为了使列数据tsv安全,我用空格替换了列数据中的所有\t字符,并在命令行上执行python代码以生成csv文件,如下所示:

hive -e 'tab_replaced_hql_query' |  python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.excel_tab);writer = csv.writer(sys.stdout, dialect=csv.excel)\nfor row in reader: writer.writerow(row)")'

这创建了一个完全有效的csv。希望这能帮助那些来寻找这个解决方案的人。

rjee0c15

rjee0c1515#

您应该使用createtableasselect(ctas)语句在hdfs中创建一个目录,其中包含查询结果的文件。之后,您将不得不导出这些文件从hdfs到您的常规磁盘,并合并成一个单一的文件。
您可能还需要做一些技巧来将文件从“\001”分隔转换为csv。您可以使用自定义csv serde或对提取的文件进行后处理。

相关问题