需求描述

在推荐业务场景中,会有些好友推荐的应用出现,例如现在的QQ好友推荐。那么在早些年头,关于共同好友的算法题是通过MR来实现的,也是大厂面试题中的一道。昨天跟朋友又聊到这道题目,讨论使用SQL如何实现?那么先来看下这道题的描述,以及扩展问题。
问题描述:比如某社交公司想实现一种功能给用户推荐好友,比如小明和小张不是好友,但是他们有一个共同好友小王,那么我们就可以把小明推荐给小张,给小张推荐小明。
公司在推荐时,会根据共同好友数决定推荐的先后顺序。我们现在有以下表结构,假设数据如下::

用户user

好友列表friend_list

小明

小张,小李,小孙

小张

小明,小李

小李

小明,小张,小孙

小孙

小明,小李,小王

小王

小孙

教你用Hive/Spark实现图谱计算_表结构

那么需求来了,现在我们要统计出共同好友的数量,即输出结果包括以下三个字段(即user1和user2共同的好友数用mutual_friends_cnt表示):

举例:比如小明的好友中有小李和小张,而小张的好友里也有小李,那么小明和小张的共同好友就是小李。

教你用Hive/Spark实现图谱计算_好友列表_02

最终的结果展示为:

user1

user2

mutual_friends_cnt

小明

小张

1

小明

小李

2

小明

小孙

1

小张

小明

1

小张

小李

1

小李

小明

2

小李

小张

1

小李

小孙

1

小孙

小明

1

小孙

小李

1

扩展问题

那么基于上面的需求,我们再次扩展一下,统计出非好友之间的共同好友数,即比如小明和小孙是好友,小孙的好友中有小王,而小王和小明不是好友,那么小王和小明之间的共同好友就是小孙。所以在推荐时就会把小王推荐给小明,把小明推荐给小王。

教你用Hive/Spark实现图谱计算_大数据_03

最终的结果展示为:

用户user1

用户user2

共同好友数

小明

小王

1

小张

小孙

2

小李

小王

1

小孙

小张

2

小王

小明

1

小王

小李

1

分析

该分析流程可能不是最优解,读者如果有好的思路,可以扫描底部的二维码进群讨论。

1、统计好友之间的共同好友数分析

  1.1、基于现有的表结构,需要根据每个用户的好友列表A_list进行迭代找到每个好友的对应好友列表B_list

  1.2、将每个好友的对应的B_list中的元素和A_list中的元素进行比对,找到两个列表中的交集。

具体示例步骤见下图:

教你用Hive/Spark实现图谱计算_表结构_04

2、统计非好友之间的共同好友数分析

  2.1、基于现有的表结构,需要根据每个用户的好友列表A_list进行迭代找到每个好友的对应好友列表B_list

  2.2、将每个好友的对应的B_list中的元素和A_list中的元素进行比对,找到不在A_list中的元素

  2.3、按照好友列表A_list对应的用户、不在A_list中的用户且属于B_list中的用户进行组合,得到两个不关联用户之间的共同好友列表

具体示例步骤见下图:

教你用Hive/Spark实现图谱计算_大数据_05

实现

1、统计好友之间的共同好友数分析

教你用Hive/Spark实现图谱计算_好友列表_06

教你用Hive/Spark实现图谱计算_好友列表_07

2、统计非好友之间的共同好友数分析

教你用Hive/Spark实现图谱计算_表结构_08

教你用Hive/Spark实现图谱计算_好友列表_09