使用hive求共同好友
程序员文章站
2022-03-08 14:33:06
...
一个mapreduce的经典题目——求共同好友,目前网上还没有人用hive实现,我来用hive算一下。
一、数据准备
create table friends(people string,friends string);
insert into table friends(people,friends) values('A','B,C,D,F,E,O,J');
insert into table friends(people,friends) values('B','A,C,E,K'),('C','F,A,D,I');
insert into table friends(people,friends) values('D','A,E,F,L'),('E','B,C,D,M,L'),('F','A,B,C,D,E,O,M'),('G','A,C,D,E,F'),('H','A,C,D,E,O'),('I','A,O'),('J','B,O'),('K','A,C,D'),('L','D,E,F'),('M','E,F,G'),('O','A,H,I,J'),('X','A');
select * 看一下数据,没有问题:
二、计算过程
先粘贴一下sql:
--第一步,把friends拆开
create table friends_tmp_01 as
select people,friend from friends lateral view explode(split(friends,',')) tmp as friend;
--第二步,计算
select
people2,concat_ws(',',collect_list(friend)) as common_friends
from
(--friends_tmp_01自连接之后过滤,得到“好友,用户1,用户2”
select
a.friend,concat(a.people,'-',b.people) as people2
from
(select people,friend from friends_tmp_01) a
join
(select people,friend from friends_tmp_01) b
on a.friend=b.friend
where a.people<b.people
) x
group by people2
order by people2
每一步中间结果如下,便于理解
第一步拆分的结果,生成“人,朋友”
第二步的中间结果“好友,用户1,用户2”如下
select
a.friend,a.people,b.people
from
(select people,friend from friends_tmp_01) a
join
(select people,friend from friends_tmp_01) b
on a.friend=b.friend
where a.people<b.people
再把用户1,用户2拼接起来作为分组条件,把“用户1-用户2”共同的好友拼起来,就是想要的结果了
欢迎指正
上一篇: 我一向是开灵柩车的,刚改开出租车……
下一篇: 要明白 机器学习 只是机器智能的一部分,