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