案例情況:同事使用公司數據探查跑一段代碼,部分代碼如下,報錯,顯示不支持in內的子查詢。但是直接用虛擬機去跑的話代碼沒有任何報錯,也出結果,很奇怪。
SELECT t1.SIGN_CODE AS bus_src ,t1.ORGANIZATION_NO ,t3.loan_amts ,t4.restSum ,NULL AS c1 ,NULL AS c2 ,NULL AS c3 ,t5.draft_cnt ,t5.draft_amt ,t5.draft_amt AS draft_balance ,NULL AS c4 FROM FDM_SOR.SOR_EVT_TBL_FB_CUST t1 where t1.FB_CUST_CODE in ( select e.CUST_CODE from FDM_SOR.SOR_EVT_TBL_FB_CREDIT e where e.COMPANY_CODE='5103' ) and t1.FB_CUST_CODE in ( select e.FB_CUST_CODE from FDM_SOR.SOR_EVT_TBL_FB_LOAN e where CURRENT_SETTLE_FLAG != 1 )
Hive對子查詢的支持很有限。它只允許子查詢出現在SELECT語句的FROM子句中。
如果發現Hive不支持你寫的子查詢,可以看看能不能把它寫成連接操作。
例如,一個IN子查詢可以寫成一個半連接或連接。
如下,使用join去替換in內的子查詢
SELECT t1.SIGN_CODE AS bus_src ,t1.ORGANIZATION_NO ,t1.loan_amts ,t1.restSum ,NULL AS c1 ,NULL AS c2 ,NULL AS c3 ,t1.draft_cnt ,t1.draft_amt ,t1.draft_amt AS draft_balance ,NULL AS c4 FROM FDM_SOR.SOR_EVT_TBL_FB_CUST t1 inner join( select e.CUST_CODE as FB_CUST_CODE from FDM_SOR.SOR_EVT_TBL_FB_CREDIT e where e.COMPANY_CODE='5103' ) a11 on t1.FB_CUST_CODE = a11.FB_CUST_CODE inner join ( select e.FB_CUST_CODE from FDM_SOR.SOR_EVT_TBL_FB_LOAN e where CURRENT_SETTLE_FLAG != 1 ) c11 on t1.FB_CUST_CODE = c11.FB_CUST_CODE
既然該子查詢在虛擬機跑的通的話,那就說明hive肯定是支持in內的查詢的,但是為什么用web界面的探查去跑會報錯呢。
在hive的官網說,hive在0.13版本以后開始支持更多的子查詢,如in ,not in的子查詢。
如果我們用的hive不支持如in,exists,not in等子查詢,很可能是0.13版本之前的舊版本。

