问题描述
|
Hive文档再次缺乏:
我想将查询结果以及列名写入本地文件。
Hive支持吗?
Insert overwrite local directory \'tmp/blah.blah\' select * from table_name;
另外,还有一个单独的问题:StackOverflow是获得Hive帮助的最佳场所吗? @Nija一直非常有帮助,但我不想一直困扰着他们……
解决方法
Hive不支持写入本地目录。您的语法也很合适。
查阅SELECTS和FILTERS上的文档以获取更多信息。
我认为Hive无法将列名写入正在运行的查询的文件中。 。 。我不能肯定地说不,但是我不知道有什么办法。
我认为,关于Hive问题的唯一优于SO的地方是邮件列表。
,尝试
set hive.cli.print.header=true;
,是的你可以。将ѭ2放入主目录中的.hiverc
文件或任何其他配置用户属性文件中。
模糊警告:请小心,因为这过去曾使我的查询崩溃(但我不记得原因)。
,实际上,@ nija的答案是正确的-至少据我所知。进行insert overwrite into [local] directory ...
时,没有任何方法可以写入列名称(无论是否使用本地)。
关于@ user1735861所描述的崩溃,配置单元0.7.1
(已在ѭ6in中修复)中存在一个已知的错误,该错误在执行after2ѭ之后,对任何不产生输出的HQL命令/查询造成causes8ѭ。例如:
$蜂巢-S
蜂巢>使用默认;
hive>设置hive.cli.print.header = true;
蜂巢>使用默认;
线程\“ main \”中的异常java.lang.NullPointerException
在org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:222)
在org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:287)
在org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:517)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke(Method.java:616)
在org.apache.hadoop.util.RunJar.main(RunJar.java:197)
这样做很好:
$蜂巢-S
hive>设置hive.cli.print.header = true;
蜂巢>从双选择*;
C
C
蜂巢>
非HQL命令也可以(set
,dfs
!
等)
此处更多信息:https://issues.apache.org/jira/browse/HIVE-2334
,今天,我遇到了这个问题,通过在原始查询和创建标题行的新虚拟查询之间进行UNION ALL能够获得所需的信息。我在每个部分上添加了一个排序列,并将标题设置为0,数据设置为1,这样我就可以对该字段进行排序,并确保标题行排在最前面。
create table new_table as
select
field1,field2,field3
from
(
select
0 as sort_col,--header row gets lowest number
\'field1_name\' as field1,\'field2_name\' as field2,\'field3_name\' as field3
from
some_small_table --table needs at least 1 row
limit 1 --only need 1 header row
union all
select
1 as sort_col,--original query goes here
field1,field3
from
main_table
) a
order by
sort_col --make sure header row is first
它有点笨重,但是至少您可以通过一个查询获得所需的内容。
希望这可以帮助!
,这不是一个很好的解决方案,但是我要做的是:
create table test_dat
ROW FORMAT DELIMITED FIELDS TERMINATED BY \"\\t\" STORED AS
INPUTFORMAT \"com.hadoop.mapred.DeprecatedLzoTextInputFormat\"
OUTPUTFORMAT \"org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\"
LOCATION \'/tmp/test_dat\' as select * from YOUR_TABLE;
hive -e \'set hive.cli.print.header=true;select * from YOUR_TABLE limit 0\' > /tmp/test_dat/header.txt
cat header.txt 000* > all.dat
,这是我的看法。注意,我不太熟悉bash,因此欢迎提出改进建议:)
#!/usr/bin/env bash
# works like this:
# ./get_data.sh database.table > data.csv
INPUT=$1
TABLE=${INPUT##*.}
DB=${INPUT%.*}
HEADER=`hive -e \"
set hive.cli.print.header=true;
use $DB;
INSERT OVERWRITE LOCAL DIRECTORY \'$TABLE\'
row format delimited
fields terminated by \',\'
SELECT * FROM $TABLE;\"`
HEADER_WITHOUT_TABLE_NAME=${HEADER//$TABLE./}
echo ${HEADER_WITHOUT_TABLE_NAME//[[:space:]]/,}
cat $TABLE/*