面試官:Hive表有數據,但為什么 Iimpala 查詢不到數據?
張工是一名程序員,做java開發的,有兩年多開發經驗,有次到一家軟件公司應聘大數據開發崗位,面試官問了他這樣一個問題。
hive表有數據,但為什么impala查詢不到數據?
你能說說這是什么情況導致的,有什么辦法解決方案嗎?
對于這個問題,我們不妨來回顧下,什么情況下hive表有數據,但impala沒有數據的情況。
1. 問題描述
用insert overwrite方式往hive寫入的數據,數據寫入成功了,在hive查詢是可以查到數據的,但在impala刷新元數據后,查詢卻沒有查到,剛開始以為是元數據刷新不成功,再用命令
invalidate metadata table_name
refresh table_name
刷新成功后還是沒有數據,返回結果為空。
2.問題追溯
往hive表寫入數據sql里使用了union ,導致hdfs目錄結構多了一層,本來數據是在分區第一層的,使用了union 后,數據存儲到分區底下的文件夾了。
導致impala無法訪問到具體數據。impala版本2.12,查看impala版本命令(impala-shell -v)
3.解決方案
在寫入數據sql 后面加上 distribute by + 表中字段 就可以了。
這是為什么呢,為什么加上distribute by +表中字段 就可以了。
我們知道,distribute 是分配、分布的意思,顧名思義,hive中(distribute by + “表中字段”)關鍵字就是控制map輸出結果的分發,相同字段的map輸出會發到一個reduce節點去處理。
總結
hive表有數據,impala表沒有數據,檢查是否刷新元數據,操作命令:
invalidate metadata
refresh table_name。已經成功刷新元數據了,impala依然沒有數據, 檢查寫入hive sql 是否使用union方式,如果是,在sql 后面加上(distribute by + 表中字段 )。
拓展:
distribute by、sort by、cluster by