Hive中cawhen不⽀持⼦查询的解决⽅法
在mysql等关系型数据库中,ca when 函数在条件判断中是我们经常使⽤的函数。同样的hive中也有这个函数。但是由于hive不⽀持ca when的⼦查询写法,所以我们需要改成join的语法。(ps:hive中也不⽀持exist或者not exist这种⼦查询⽤法)
⼀、数据库中的通常⽤法
如下,我简单写了⼀个业务场景
数据准备:qy_clue_account 线索表 和 lnk_opty 商机表,⼆者通过主键row_id和外键head_id字段关联。
SELECT
count(
DISTINCT(
CASE
WHEN(
SELECT
count(*)
FROM
lnk_opty
WHERE
STAGE ='Finish'
AND OPTY_STATE NOT IN(
'Reassign',
'AListOfLostArticles'
)
)
>0THEN
END
)
) finishedOptyNum
FROM
qy_clue_account t0
LEFT JOIN lnk_opty t1 ON t0.ROW_ID = t1.HEAD_ID
也可以换⼀种写法,放到where条件中
SELECT
count(DISTINCT( t0.row_id )) finishedOptyNum
FROM
qy_clue_account t0
LEFT JOIN lnk_opty t1 ON t0.ROW_ID = t1.HEAD_ID
WHERE
(SELECT
count(*)
FROM
lnk_opty
WHERE
STAGE ='Finish'
AND OPTY_STATE NOT IN('Reassign','AListOfLostArticles'))>0
但是这两种写法在hive中是实现不了的,下⾯具体看⼀下hive中如何改写ca when
⼆、hive案例:
需求:要查询某个字段是否在另⼀张表中,⼤概情况就是
A表:
B表:
我要查询 A表中当value2为0的时候直接输出0,为1的时候,判断value1是否在B表的value1中,如果在那么便输出0,不在便输出1, 拿到第⼀反应是:
lect
ca
when value2 =0then0
when value2 =1then
ca
when value1 in(lect value1 from B)then0
el1
end
end as value3
from A
结果Hive就报错了
⼤概意思就是:⽬前的⼦查询表达式只允许为Where条件谓词。于是我们就必须将其改为使⽤left join来解决。
lect
ca
when a.value2 =0then0
when a.value2 =1then
ca when
b.value1 is not null then0
el1
END
END as value3
from A a
left join
B b
on a.value1 = b.value1;