Hive:将列标题写入本地文件?

时间:2011-04-13 23:31:04

标签: syntax hive

Hive文档再次缺乏:

我想将查询结果写入本地文件以及列的名称。

Hive支持吗?

Insert overwrite local directory 'tmp/blah.blah' select * from table_name;

另外,另外一个问题:StackOverflow是获得Hive帮助的最佳位置吗? @Nija,非常乐于助人,但我不打算一直打扰他们......

7 个答案:

答案 0 :(得分:64)

尝试

set hive.cli.print.header=true;

答案 1 :(得分:15)

是的,你可以。将set hive.cli.print.header=true;放在主目录中的.hiverc文件或任何其他配置单元用户属性文件中。

模糊警告:小心,因为过去我的查询已经崩溃了(但我不记得原因)。

答案 2 :(得分:9)

确实,@ nija的回答是正确的 - 至少据我所知。在执行insert overwrite into [local] directory ...时(无论您是否使用本地),无法编写列名。

关于@ user1735861描述的崩溃,hive 0.7.1中已知错误(已在0.8.0中修复),在执行set hive.cli.print.header=true;后导致NullPointerException对于任何不产生输出的HQL命令/查询。例如:

$ hive -S
hive> use default; 
hive> set hive.cli.print.header=true;
hive> use default;
Exception in thread "main" java.lang.NullPointerException
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:222)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:287)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:517)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:197)

然而这很好:

$ hive -S
hive> set hive.cli.print.header=true;
hive> select * from dual;
c
c
hive> 

非HQL命令很好(setdfs !等等。)

此处有更多信息:https://issues.apache.org/jira/browse/HIVE-2334

答案 3 :(得分:6)

Hive支持写入本地目录。你的语法也适合它。
查看the docs on SELECTS and FILTERS了解更多信息。

我认为Hive没有办法将列的名称写入您正在运行的查询的文件中。 。 。我不能确定它没有,但我不知道一种方式。

我认为Hive问题唯一比SO更好的地方是the mailing list

答案 4 :(得分:4)

我今天遇到了这个问题,并且能够通过在原始查询和创建标题行的新虚拟查询之间执行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,
    field2,
    field3
  from
    main_table
) a
order by 
  sort_col  --make sure header row is first

它有点笨重,但至少你可以通过一次查询得到你需要的东西。

希望这有帮助!

答案 5 :(得分:3)

不是一个很好的解决方案,但这就是我的工作:

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

答案 6 :(得分:2)

这是我对它的看法。请注意,我不太熟悉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/*