在传统的关系型数据库中,是支持子查询操作的,但是在基于Hadoop的hive中却不支持这一操作,因此可以通过一些方法进行转换。
实例,执行如下sql:
select *
from dw.ordersnap_total
where d='2018-08-09'
and session_id in ( select session_id
from rcmd_track_path
where ds=$date
and add_cart_flag>0
and product_id>0
);
会报错,这是因为hive不支持in子查询的方法,但是可以用另外一种函数来进行替换:left semi join
替换代码:
select *
from dw.ordersnap_id
left semi join dw.ordersnap_id t2
on (t1.session_id=t2.session_id
and t2.add_cart_flag>0
and t2.product_id>0
and t1.ds=$date
and t2.ds=$date );
用法:
hive中用left semi join来替换子查询时,left semi join的限制只能在t2表的on子句中设置过滤条件,在where子句、select子句或其他地方过滤都会报错。
————————————————
版权声明:本文为优快云博主「数据小白的进阶之路」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_37536446/article/details/81536021
5058

被折叠的 条评论
为什么被折叠?



