再次缺少Hive文檔:Hive:將列標題寫入本地文件?
我想將查詢的結果寫入本地文件以及列的名稱。
Hive支持嗎?
Insert overwrite local directory 'tmp/blah.blah' select * from table_name;
另外,單獨的問題:是否StackOverflow是獲得Hive幫助的最佳位置? @Nija,一直很有幫助,但我不打擾他們......
再次缺少Hive文檔:Hive:將列標題寫入本地文件?
我想將查詢的結果寫入本地文件以及列的名稱。
Hive支持嗎?
Insert overwrite local directory 'tmp/blah.blah' select * from table_name;
另外,單獨的問題:是否StackOverflow是獲得Hive幫助的最佳位置? @Nija,一直很有幫助,但我不打擾他們......
Hive支持寫入本地目錄。你的語法也適合它。
查看the docs on SELECTS and FILTERS瞭解更多信息。
我不認爲Hive有辦法將列的名稱寫入到您正在運行的查詢的文件中。 。 。我不能肯定地說這不是,但我不知道有什麼辦法。
我認爲對於Hive問題唯一比SO好的地方是the mailing list。
嘗試
set hive.cli.print.header=true;
當然可以。將set hive.cli.print.header=true;
放入主目錄中的.hiverc
文件或任何其他配置單元用戶屬性文件中。
模糊警告:小心,因爲這已經使我的查詢在過去崩潰(但我不記得原因)。
屬性hive.cli.print.header = true不適用於「插入覆蓋本地目錄」命令。它運作,如果我們運行'蜂巢-e'選擇..'> Out.tsv' – Munesh 2016-07-30 00:52:18
的確,@ 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命令都很好,但(set
,dfs
!
,等...)
不是一個很好的解決方案,但這裏是我所做的:
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
這可能會很慢 – OneSolitaryNoob 2014-10-01 21:33:09
我今天遇到了這個問題,並能夠通過在原始查詢和創建標題行的新的虛擬查詢之間進行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
這是有點笨重,但至少你可以得到你需要的一個單一的查詢。
希望這會有所幫助!
如果col值是布爾值,數組等等,這將失敗。 – amrk7 2016-09-12 14:30:51
有沒有一種方法可以永久地將此設置爲默認值,而不必在每個配置單元shell和/或命令調用時指定此設置? – 2012-10-01 22:10:06
我試過了;它會將標題輸出到控制檯,而不是本地文件。 。 。 – maverick 2012-11-09 21:42:04
@JD是的,只是把它放到你的主目錄中的'.hiverc'文件中 – wlk 2013-09-16 14:38:44