MapReduce实现好友单向推荐

需求:
现有一份QQ好友数据,其中数据第一列代表用户QQ昵称,第二列代表好友QQ昵称。要求编写MapReduce程序实现QQ好友推荐,例如A的好友是B,B的好友是C,即A与C有共同的好友B,则可以向A推荐C,向C推荐A。通过MapReduce完成推荐后,会发现存在给A推B,也给B推A的重复情况,请继续完成处理,避免这个重复操作。

数据:
A,B
A,C
A,E
B,D
B,A
B,F
C,E
C,A

共同好友依次为A,B,C

即要求运行结果为:A -> C,A -> D…

代码如下:

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;


public class QqFriendsMapper extends Mapper<LongWritable, Text,Text,Text> {
   
    private String spliter="";

    @Override
    protected void setup(Mapper<LongWritable, Text, Text, Text>.Context context) throws IOException, InterruptedException {
   
        spliter = context.getConfiguration().get(spliter);
    }

    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context) throws 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
社交好友推荐是一个经典的推荐系统问题,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代码的文件名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值