使用hive求共同好友

Posted badbeat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用hive求共同好友相关的知识,希望对你有一定的参考价值。

一个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”共同的好友拼起来,就是想要的结果了

欢迎指正

以上是关于使用hive求共同好友的主要内容,如果未能解决你的问题,请参考以下文章

Hive面试题系列第六题-互为好友问题

Hive面试题系列第六题-互为好友问题

Hive面试题系列第六题-互为好友问题

hadoop实现求共同好友

第3节 mapreduce高级:23课程大纲&共同好友求取步骤二

MapReduce--——求两两共同好友