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升級碰到的坑