在传统的关系型数据库中,是支持子查询操作的,但是在基于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子句或其他地方过滤都会报错。