1. 程式人生 > 其它 >Hive 常見問題與技巧【Updating】

Hive 常見問題與技巧【Updating】

1Q: 是否有像類似於phpmyadmin一樣的hive查詢客戶端,能以介面的方式查詢hive語句和匯出資料

A: 有的,客戶端的話可以使用squirrel來連線hive,squirrel是一個通用的資料庫查詢客戶端,還有有一個開源專案phphiveadmin也不錯,

web方式訪問hive,這裡也有一個hive web client(https://github.com/lalaguozhe/hiveweb-1)

2Q: 執行語句時候,能否控制reducer的個數

A: 可以在執行hive語句之前先 set mapred.reduce.tasks=<number>

3Q: 是否可能在輸出的時候在結果第一行列印列名

A: 可以在執行hive語句之前先 set hive.cli.print.header=true;

4Q: Hive是否支援跨資料庫查詢,比如database arch的table1和database algo的table2 進行join

A: 可以,只要有使用者有這兩張表的select許可權即可,使用者需要用“database.table”的方式來指定資料庫下的表

5Q: Hive是否有內建的函式,可以對輸出的資料進行處理

A: Hive提供了豐富的內建函式,參見https://cwiki.apache.org/Hive/languagemanual-udf.html

使用者也可以自己實現自定義的UDF方法來滿足更復雜的查詢需求

6Q: Hive支援exist in麼?

A: 不支援,但是可以通過改寫語句達到相同的效果,比如對於查詢語句:

SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM B);

可以改寫成:

SELECT a.key, a.val

FROM a LEFT SEMI JOIN b on (a.key = b.key)

PS:上述答案過時了,目前 hive 已經支援 in 查詢了。

http://blog.csdn.net/yfkiss/article/details/8073608

7Q:Hive是否支援本地執行模式

A:Hive支援本地執行模式,當資料量小的時候,本地執行比提交到叢集上執行效率提升很大

set hive.exec.mode.local.auto=true(預設false)

當一個job滿足如下條件才能真正使用本地模式:

1.job的輸入資料大小必須小於引數hive.exec.mode.local.auto.inputbytes.max(預設值128MB)

2.job的map處理的檔案數大於引數hive.exec.mode.local.auto.input.files.max(預設值4)

3.job的reduce數必須為0或者1,不管是使用者設定的還是系統推測出來的

用引數hive.mapred.local.mem(預設0)來設定local mode下mapper和reducer task jvm heap size

8Q: 關鍵詞UNION ALL的用法

A:The number and names of columns returned by each select_statement has to be the same. Otherwise, a schema error is thrown.

UNION ALL兩邊的欄位名,和欄位數都必須一致,可以用as xxx來統一欄位名,並且目前UNION ALL只能作為子查詢。

9Q:hive left outer join的問題:where 與 on 條件的區別

http://blog.csdn.net/lalaguozhe/article/details/9498947

10Q:其它技巧請見:

http://my.oschina.net/leejun2005/blog/121945

11、對於 jar 包呼叫失敗 NullPointerException 的問題:

FAILED: Error in metadata: java.lang.NullPointerException FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

你可能需要再 hive-site.xml 中新增 jar 的路徑:

具體參考:http://abloz.com/2013/03/28/the-hive-execute-statements-times-nullpointerexception.html

<property>
	<name>
		hive.aux.jars.path
	</name>
	<value>
		file:///home/june/soft/hive-0.9.0-bin/lib/hive-json-serde.jar
	</value>
</property>

12、通過偽列定位出錯的原始檔案和行號:http://blog.csdn.net/lalaguozhe/article/details/11467593

通常使用者在HIVE中用SELECT語句出來結果,無法確定結果是來自哪個檔案或者具體位置資訊,HIVE中考慮到了這點,在Virtual Column虛列中可以指定三個靜態列: 1.  INPUT__FILE__NAME        map任務讀入File的全路徑 2.  BLOCK__OFFSET__INSIDE__FILE       如果是RCFile或者是SequenceFile塊壓縮格式檔案則顯示Block file Offset,也就是當前快在檔案的第一個字偏移量,如果是TextFile,顯示當前行的第一個位元組在檔案中的偏移量 3.  ROW__OFFSET__INSIDE__BLOCK        RCFile和SequenceFile顯示row number, textfile顯示為0 注:若要顯示ROW__OFFSET__INSIDE__BLOCK ,必須設定set hive.exec.rowoffset=true;

select hostname, INPUT__FILE__NAME,BLOCK__OFFSET__INSIDE__FILE,ROW__OFFSET__INSIDE__BLOCK from t_NginxLog where dt='2013-09-01' limit 10;

REF:

Hive 常見問題(持續更新。。。)

http://blog.csdn.net/lalaguozhe/article/details/9081971

hive 0.10 0.11新增特性綜述

http://blog.csdn.net/lalaguozhe/article/details/11730817

hive0.11升級碰到的坑

http://blog.csdn.net/lalaguozhe/article/details/17504761