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

CMa*_*ury 28 syntax hive

Hive文档再次缺乏:

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

Hive支持这个吗?

Insert overwrite local directory 'tmp/blah.blah' select * from table_name;
Run Code Online (Sandbox Code Playgroud)

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

小智 63

尝试

set hive.cli.print.header=true;
Run Code Online (Sandbox Code Playgroud)

  • 我试过这个; 它会导致标头输出到控制台,而不是输出到本地文件... (19认同)
  • @JD是的,只需将其放入主目录中的`.hiverc`文件即可 (7认同)
  • 这不符合OP问题 (3认同)

小智 15

是的你可以.把set hive.cli.print.header=true;一个.hiverc文件在你的主目录或任何其他蜂巢用户属性的文件.

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

  • 属性hive.cli.print.header = true对"插入覆盖本地目录"命令不起作用.它运行'hive -e'选择..'> Out.tsv' (4认同)

Her*_*ium 9

事实上,@尼娅的答案是正确的-至少就我所知.没有任何办法做的时候写的列名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命令都很好,但(set,dfs !,等...)

更多资讯:https://issues.apache.org/jira/browse/HIVE-2334


Qui*_*nnG 6

Hive确实支持写入本地目录.你的语法也适合它.有关其他信息,
请查看有关SELECTS和FILTERS的文档.

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

我认为Hive问题唯一比SO更好的地方就是邮件列表.