84

我们想将 Hive 查询的结果放到 CSV 文件中。我认为命令应该如下所示:

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

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

4

18 回答 18

147

尽管可以使用INSERT OVERWRITE从 Hive 中获取数据,但对于您的特定情况,它可能不是最佳方法。首先让我解释一下是做什么INSERT OVERWRITE的,然后我将描述我用来从 Hive 表中获取 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 运行查询,并将其通过管道传输到本地文件中,如下所示:

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

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

基于这个 patch-3682,我怀疑在使用 Hive 0.11 时可以使用更好的解决方案,但我自己无法对此进行测试。新语法应允许以下内容。

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

希望有帮助。

于 2013-08-09T07:44:12.670 回答
24

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

hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
于 2014-01-23T19:22:40.707 回答
7

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

hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv
于 2019-06-14T17:55:42.027 回答
4

您应该使用 CREATE TABLE AS SELECT (CTAS) 语句在 HDFS 中创建一个目录,其中包含包含查询结果的文件。之后,您必须将这些文件从 HDFS 导出到您的常规磁盘并将它们合并到一个文件中。

您可能还需要做一些技巧来将文件从 '\001' - 分隔为 CSV。您可以使用自定义 CSV SerDe 或对提取的文件进行后处理。

于 2013-08-08T17:23:40.023 回答
4

您可以使用INSERT…… DIRECTORY,如本例所示:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';

OVERWRITE并且LOCAL具有与以前相同的解释,并且路径按照通常的规则进行解释。/tmp/ca_employees根据调用的 reducer 的数量,将写入一个或多个文件。

于 2014-06-29T07:38:09.027 回答
3

如果您使用 HUE,这也相当简单。只需转到 HUE 中的 Hive 编辑器,执行您的 Hive 查询,然后在本地将结果文件保存为 XLS 或 CSV,或者您可以将结果文件保存到 HDFS。

于 2014-07-29T18:00:38.260 回答
3

您可以使用配置单元字符串功能CONCAT_WS( string delimiter, string str1, string str2...strn )

例如:

hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
于 2015-04-08T21:03:31.443 回答
3

我一直在寻找类似的解决方案,但这里提到的那些不起作用。我的数据有各种空格(空格、换行符、制表符)字符和逗号。

为了使列数据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。希望这对那些来寻找此解决方案的人有所帮助。

于 2015-08-27T00:49:34.253 回答
2

我有一个类似的问题,这就是我能够解决它的方法。

第 1 步- 将 Hive 表中的数据加载到另一个表中,如下所示

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 从 Hive 仓库复制到具有适当扩展名的新位置

Start-AzureStorageBlobCopy
-DestContext $destContext 
-SrcContainer "Source Container"
-SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"
于 2014-05-29T14:24:36.417 回答
2
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 并运行您的查询

于 2019-04-12T15:14:39.683 回答
1

默认分隔符是“ ^A”。在python语言中,它是“ \x01”。

当我想更改分隔符时,我使用如下 SQL:

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

然后,将 delimiter+" ^A" 视为新的分隔符。

于 2013-11-06T22:27:17.843 回答
1

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

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

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

您也可以使用tr "|" ","“|”来转换 到 ”,”

于 2018-12-11T21:34:03.323 回答
0

与上面 Ray 的回答类似,Hortonworks Data Platform 中的 Hive View 2.0 还允许您运行 Hive 查询,然后将输出保存为 csv。

于 2018-01-03T13:35:43.173 回答
0

如果您是从 Windows 执行此操作,您可以使用 Python 脚本hivehoney将表数据提取到本地 CSV 文件。

它会:

  1. 登录堡垒主机。
  2. 布伦。
  3. 基尼特。
  4. 直线(与您的查询)。
  5. 将直线的回声保存到 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
于 2018-11-21T14:57:12.700 回答
0

只是为了在启动查询后涵盖更多以下步骤: INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;

在我的例子中,临时文件夹下生成的数据是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
于 2019-03-25T20:22:43.957 回答
0

我可能迟到了,但会帮助回答:

echo "COL_NAME1|COL_NAME2|COL_NAME3|COL_NAME4" > SAMPLE_Data.csv hive -e ' 如果需要,从 table_Name where 子句中选择不同的 concat(COL_1, "|", COL_2, "|", COL_3, "|", COL_4);' >> SAMPLE_Data.csv

于 2019-04-18T05:35:56.797 回答
0

此 shell 命令将 csv 中的输出格式打印为output.txt不带列标题。

$ hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf hive.cli.print.header=false > output.txt
于 2019-05-10T10:21:24.670 回答
0

使用命令:

hive -e "使用 [database_name];从 [table_name] LIMIT 10 中选择 *;" > /path/to/file/my_file_name.csv

我有一个庞大的数据集,我试图组织并确定攻击类型和每种类型的数量。我在实践中使用的一个例子(并且有更多细节)是这样的:

hive -e "use DataAnalysis;
select attack_cat, 
case when attack_cat == 'Backdoor' then 'Backdoors' 
when length(attack_cat) == 0 then 'Normal' 
when attack_cat == 'Backdoors' then 'Backdoors' 
when attack_cat == 'Fuzzers' then 'Fuzzers' 
when attack_cat == 'Generic' then 'Generic' 
when attack_cat == 'Reconnaissance' then 'Reconnaissance' 
when attack_cat == 'Shellcode' then 'Shellcode' 
when attack_cat == 'Worms' then 'Worms' 
when attack_cat == 'Analysis' then 'Analysis' 
when attack_cat == 'DoS' then 'DoS' 
when attack_cat == 'Exploits' then 'Exploits' 
when trim(attack_cat) == 'Fuzzers' then 'Fuzzers' 
when trim(attack_cat) == 'Shellcode' then 'Shellcode' 
when trim(attack_cat) == 'Reconnaissance' then 'Reconnaissance' end,
count(*) from actualattacks group by attack_cat;">/root/data/output/results2.csv
于 2020-07-15T10:38:15.087 回答