hivesql如何在数据量超大时避免join操作

hivesql如何在数据量超大时避免join操作

当在hive中对超大的表进行查询时,在这种情况下不能进行mapjoin,也选择不进行skewjoin或是smbjoin

。此时,针对特定的应用场景,可以设计特殊的sql避免join操作。下面给出一个典型案例:

假设有一个用户关注者记录表(t_user_follower),其中有两个字段,用户id(user_id),关注者列表(follower_ids),关注者列表中是关注用户的用户ID。找出相互关注的用户的id

我们可以通过以下语句建立一个样例表,表的实际数据量应该很大

create table t_user_follower
(
user_id string comment '用户id',
follower_ids string comment '关注者列表'
);

-- 数据插入语句
insert into t_user_follower values
('0001','0002,0003'),
('0002','0001,0003'),
('0003','0004'),
('0004','0001,0002');

解决方法如下

#1.使用lateral view 和explode函数将follower_ids列中的数据转换成多行
select
  user_id,
  follower_ids,
  follower_id
from t_user_follower
lateral view explode(split(follower_ids,',')) t as follower_id;
#2.把user_id和follwer_id进行有序拼接,确保拼接的列都是小数在前大数在后。例如 0001 关注0002 和 0002 关注 0001生成的新列都是0001,0002
select
  user_id,
  follower_ids, 			if(user_id<follower_id,concat_ws(',',user_id,follower_id),concat_ws(',',follower_id,user_id)) as friend,
  follower_id
from t_user_follower
lateral view explode(split(follower_ids,',')) t as follower_id;
#3.按friend列进行分组,只要出现同一组中有两个相同的friend,就说明两个用户是互相关注的。
select
    friend
from
(select
  user_id,
  follower_ids, if(user_id<follower_id,concat_ws(',',user_id,follower_id),concat_ws(',',follower_id,user_id)) as friend,
  follower_id
from t_user_follower
lateral view explode(split(follower_ids,',')) t as follower_id)tt
group by friend
having count(*)=2;

对于这个问题,如果使用join操作,则整个查询的复杂度会非常的高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值