面試官:Hive表有數(shù)據(jù),但為什么 Iimpala 查詢(xún)不到數(shù)據(jù)?
張工是一名程序員,做java開(kāi)發(fā)的,有兩年多開(kāi)發(fā)經(jīng)驗(yàn),有次到一家軟件公司應(yīng)聘大數(shù)據(jù)開(kāi)發(fā)崗位,面試官問(wèn)了他這樣一個(gè)問(wèn)題。
hive表有數(shù)據(jù),但為什么impala查詢(xún)不到數(shù)據(jù)?
你能說(shuō)說(shuō)這是什么情況導(dǎo)致的,有什么辦法解決方案嗎?
對(duì)于這個(gè)問(wèn)題,我們不妨來(lái)回顧下,什么情況下hive表有數(shù)據(jù),但impala沒(méi)有數(shù)據(jù)的情況。
1. 問(wèn)題描述
用insert overwrite方式往hive寫(xiě)入的數(shù)據(jù),數(shù)據(jù)寫(xiě)入成功了,在hive查詢(xún)是可以查到數(shù)據(jù)的,但在impala刷新元數(shù)據(jù)后,查詢(xún)卻沒(méi)有查到,剛開(kāi)始以為是元數(shù)據(jù)刷新不成功,再用命令
invalidate metadata table_name
refresh table_name
刷新成功后還是沒(méi)有數(shù)據(jù),返回結(jié)果為空。
2.問(wèn)題追溯
往hive表寫(xiě)入數(shù)據(jù)sql里使用了union ,導(dǎo)致hdfs目錄結(jié)構(gòu)多了一層,本來(lái)數(shù)據(jù)是在分區(qū)第一層的,使用了union 后,數(shù)據(jù)存儲(chǔ)到分區(qū)底下的文件夾了。
導(dǎo)致impala無(wú)法訪問(wèn)到具體數(shù)據(jù)。impala版本2.12,查看impala版本命令(impala-shell -v)
3.解決方案
在寫(xiě)入數(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表沒(méi)有數(shù)據(jù),檢查是否刷新元數(shù)據(jù),操作命令:
invalidate metadata
refresh table_name。已經(jīng)成功刷新元數(shù)據(jù)了,impala依然沒(méi)有數(shù)據(jù), 檢查寫(xiě)入hive sql 是否使用union方式,如果是,在sql 后面加上(distribute by + 表中字段 )。
拓展:
distribute by、sort by、cluster by