hive中對子查詢如in,exists等支持


案例情況:同事使用公司數據探查跑一段代碼,部分代碼如下,報錯,顯示不支持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版本之前的舊版本。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM