hive中对子查询如in,exists等支持

hive中对子查询如in,exists等支持

案例情况:同事使用公司数据探查跑一段代码,部分代码如下,报错,显示不支持in内的子查询。但是直接用虚拟机去跑的话代码没有任何报错,也出结果,很奇怪。

 1 SELECT  t1.SIGN_CODE    AS bus_src
 2        ,t1.ORGANIZATION_NO
 3        ,t3.loan_amts
 4        ,t4.restSum
 5        ,NULL       AS c1
 6        ,NULL       AS c2
 7        ,NULL       AS c3
 8        ,t5.draft_cnt
 9        ,t5.draft_amt
10        ,t5.draft_amt   AS draft_balance
11        ,NULL       AS c4
12 FROM    FDM_SOR.SOR_EVT_TBL_FB_CUST   t1
13 where   t1.FB_CUST_CODE in (
14 select  e.CUST_CODE from FDM_SOR.SOR_EVT_TBL_FB_CREDIT e where e.COMPANY_CODE='5103'
15 )
16 and t1.FB_CUST_CODE in (
17 select  e.FB_CUST_CODE from FDM_SOR.SOR_EVT_TBL_FB_LOAN e where CURRENT_SETTLE_FLAG != 1     
18 )

Hive对子查询的支持很有限。它只允许子查询出现在SELECT语句的FROM子句中。
如果发现Hive不支持你写的子查询,可以看看能不能把它写成连接操作。
例如,一个IN子查询可以写成一个半连接或连接。

如下,使用join去替换in内的子查询

 1 SELECT   t1.SIGN_CODE    AS bus_src
 2         ,t1.ORGANIZATION_NO
 3         ,t1.loan_amts
 4         ,t1.restSum
 5         ,NULL       AS c1
 6         ,NULL       AS c2
 7         ,NULL       AS c3
 8         ,t1.draft_cnt
 9         ,t1.draft_amt
10         ,t1.draft_amt   AS draft_balance
11         ,NULL       AS c4
12  FROM    FDM_SOR.SOR_EVT_TBL_FB_CUST   t1
13 inner join( 
14 select   e.CUST_CODE  as FB_CUST_CODE  from  FDM_SOR.SOR_EVT_TBL_FB_CREDIT e where e.COMPANY_CODE='5103'
15 ) a11
16 on  t1.FB_CUST_CODE = a11.FB_CUST_CODE
17 inner join 
18 (
19 select   e.FB_CUST_CODE  from  FDM_SOR.SOR_EVT_TBL_FB_LOAN e where CURRENT_SETTLE_FLAG != 1      
20 ) c11
21 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版本之前的旧版本。

 

 

 大多数人都以为是才智成就了科学家,他们错了,是品格。---爱因斯坦

 

转载于:https://www.cnblogs.com/wqbin/p/11022696.html

 

posted @ 2021-07-17 16:51  温家三哥  阅读(1063)  评论(0)    收藏  举报