欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用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 * 看一下数据,没有问题:

使用hive求共同好友

二、计算过程

先粘贴一下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

每一步中间结果如下,便于理解

第一步拆分的结果,生成“人,朋友”

使用hive求共同好友

第二步的中间结果“好友,用户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

使用hive求共同好友

再把用户1,用户2拼接起来作为分组条件,把“用户1-用户2”共同的好友拼起来,就是想要的结果了

使用hive求共同好友

欢迎指正

相关标签: hive 大数据