2011-04-13 13 views
26

再次缺少Hive文檔:Hive:將列標題寫入本地文件?

我想將查詢的結果寫入本地文件以及列的名稱。

Hive支持嗎?

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

另外,單獨的問題:是否StackOverflow是獲得Hive幫助的最佳位置? @Nija,一直很有幫助,但我不打擾他們......

回答

5

Hive支持寫入本地目錄。你的語法也適合它。
查看the docs on SELECTS and FILTERS瞭解更多信息。

我不認爲Hive有辦法將列的名稱寫入到您正在運行的查詢的文件中。 。 。我不能肯定地說這不是,但我不知道有什麼辦法。

我認爲對於Hive問題唯一比SO好的地方是the mailing list

55

嘗試

set hive.cli.print.header=true; 
+1

有沒有一種方法可以永久地將此設置爲默認值,而不必在每個配置單元shell和/或命令調用時指定此設置? – 2012-10-01 22:10:06

+13

我試過了;它會將標題輸出到控制檯,而不是本地文件。 。 。 – maverick 2012-11-09 21:42:04

+5

@JD是的,只是把它放到你的主目錄中的'.hiverc'文件中 – wlk 2013-09-16 14:38:44

13

當然可以。將set hive.cli.print.header=true;放入主目錄中的.hiverc文件或任何其他配置單元用戶屬性文件中。

模糊警告:小心,因爲這已經使我的查詢在過去崩潰(但我不記得原因)。

+2

屬性hive.cli.print.header = true不適用於「插入覆蓋本地目錄」命令。它運作,如果我們運行'蜂巢-e'選擇..'> Out.tsv' – Munesh 2016-07-30 00:52:18

7

的確,@ nija的回答是正確的 - 至少據我所知。在執行insert overwrite into [local] directory ...(無論使用本地還是不使用)時,沒有任何方法來編寫列名。

至於由@ user1735861描述的崩潰,有在蜂房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

2

不是一個很好的解決方案,但這裏是我所做的:

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 
+1

這可能會很慢 – OneSolitaryNoob 2014-10-01 21:33:09

2

我今天遇到了這個問題,並能夠通過在原始查詢和創建標題行的新的虛擬查詢之間進行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 

這是有點笨重,但至少你可以得到你需要的一個單一的查詢。

希望這會有所幫助!

+0

如果col值是布爾值,數組等等,這將失敗。 – amrk7 2016-09-12 14:30:51