我们希望将Hive查询的结果放入CSV文件。我认为该命令应如下所示:
insert overwrite directory '/home/output.csv' select books from table;
当我运行它时,它说成功完成了,但是我永远找不到该文件。如何找到该文件,或者应该以其他方式提取数据?
Answers:
尽管可以用来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
这给了我一个可以用制表符分隔的文件。希望对您也有帮助。
基于此3468补丁,我怀疑使用Hive 0.11时可以使用更好的解决方案,但我自己无法对此进行测试。新语法应允许以下内容。
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
select books from table;
希望能有所帮助。
如果您想要CSV文件,则可以按以下方式修改Lukas的解决方案(假设您使用的是Linux系统):
hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
我一直在寻找类似的解决方案,但此处提到的解决方案不起作用。我的数据具有所有空白(空格,换行符,制表符)字符和逗号。
为了使列数据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。希望这对那些寻求此解决方案的人有所帮助。
这是我发现输出HiveQL结果的最csv友好方式。
您不需要任何grep或sed命令来格式化数据,而是hive支持它,只需要添加outputformat的额外标签即可。
hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv
我遇到了类似的问题,这就是我能够解决的问题。
步骤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"
只是为了在启动查询后介绍更多以下步骤:
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
我可能迟到了这一步,但会帮助您回答:
echo“ COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4”> SAMPLE_Data.csv配置单元-e'如果需要,请从table_Name where选择不同的concat(COL_1,“ |”,COL_2,“ |”,COL_3,“ |”,COL_4);' >> SAMPLE_Data.csv
此shell命令将csv中的输出格式打印为output.txt
不包含列标题的格式。
$ hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf hive.cli.print.header=false > output.txt
使用命令:
蜂巢-e“使用[数据库名称];从[表名称]限制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