idea MapReduce社交好友推荐的代码实现
时间: 2024-05-03 17:18:15 浏览: 102
社交好友推荐是一个经典的推荐系统问题,MapReduce是一个用于大规模数据处理的框架,结合起来可以高效地解决这个问题。实现思路如下:
1. 读取用户关系数据:从输入文件中读取用户关系数据,每行表示一个用户关系,例如:A B表示A和B是好友关系。
2. Map阶段:将每个用户看作一个键,将该用户的好友列表作为值,输出(key, value)键值对到中间结果中。
3. Reduce阶段:对于每个用户,将其所有好友列表合并起来,去掉重复的好友,得到该用户的所有好友集合。然后根据好友的共同好友数进行推荐,将共同好友数最多的前N个用户作为推荐好友列表,将推荐结果输出到输出文件中。
以下是代码实现(使用Python语言和Hadoop框架):
Mapper代码:
```python
#!/usr/bin/env python
import sys
# 处理每一行输入数据
for line in sys.stdin:
# 去掉前后空格
line = line.strip()
# 按照空格分隔输入数据,得到两个用户之间的好友关系
users = line.split()
# 输出每个用户及其好友列表
for user in users:
friends = [u for u in users if u != user]
print '%s\t%s' % (user, ','.join(friends))
```
Reducer代码:
```python
#!/usr/bin/env python
import sys
# 推荐列表大小
N = 10
# 处理每个用户的好友列表
def process_friends(friends_list):
# 将所有好友列表合并起来
all_friends = []
for friends in friends_list:
all_friends += friends.split(',')
# 去掉重复的好友
all_friends = list(set(all_friends))
# 统计每个好友出现的次数
count = {}
for friend in all_friends:
count[friend] = count.get(friend, 0) + 1
# 按照好友出现次数从大到小排序
sorted_count = sorted(count.items(), key=lambda x: x[1], reverse=True)
# 返回推荐列表
return [f[0] for f in sorted_count[:N]]
# 处理每个用户的好友列表
current_user = None
friends_list = []
for line in sys.stdin:
# 去掉前后空格
line = line.strip()
# 将输入数据按照键值分隔开
user, friends = line.split('\t', 1)
# 如果是新用户,则输出该用户的推荐列表
if user != current_user and current_user is not None:
recommended_friends = process_friends(friends_list)
print '%s\t%s' % (current_user, ','.join(recommended_friends))
friends_list = []
# 添加当前用户的好友列表
friends_list.append(friends)
current_user = user
# 输出最后一个用户的推荐列表
if current_user is not None:
recommended_friends = process_friends(friends_list)
print '%s\t%s' % (current_user, ','.join(recommended_friends))
```
执行MapReduce作业的命令:
```shell
hadoop jar path/to/hadoop-streaming.jar \
-input input_path \
-output output_path \
-mapper mapper.py \
-reducer reducer.py \
-file mapper.py \
-file reducer.py
```
其中,`path/to/hadoop-streaming.jar`为Hadoop Streaming的jar包路径,`input_path`为输入文件路径,`output_path`为输出文件路径,`mapper.py`和`reducer.py`为上述Mapper和Reducer代码的文件名。
阅读全文