使用Hadoop寻找两两用户之间的共同好友列表

本文介绍如何利用Hadoop MapReduce解决寻找两两用户间的共同好友问题。通过解析用户好友数据,Map阶段生成用户好友对,Reduce阶段合并相同好友对的用户,输出共同好友列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Hadoop寻找两两用户之间的共同好友列表

1.问题描述

假定有一个社会网络A,每一个顶点表示一位用户,每一条边表示连接的两位用户是好友。A=(V,G),其中V是用户的集合,G是边的集合,即好友的集合。用文件分别保存V和G的数据,示例如下。例如G文件中,“a,b”表示用户a和用户b是好友。

#V文件:
a
b
c
…
#G文件:
a,b
a,c
b,e
b,k
…

找出哪些用户两两之间有共同好友,输出他俩的共同好友列表。例如:

a-b: e,k
a-c: g
b-c: a
……

2.思路

之前的问题已经得到了每一位用户的好友,比如问题1得到的结果中用户“a”和他的好友表示形式为“a: b,c,e,g,k”。要得到哪些用户两两之间有共同好友以及他们的共同好友,Map端只需将问题1得到的结果的每一行该用户的好友列表中的好友两两拎出来(问题1得到的好友列表已经是有序的,如果该用户没有两个或者两个以上的好友就退出当前map( )函数),将他们组合成新的key,value就是该用户,将<好友1-好友2, 用户>输出为中间结果。比如“a: b,c,e,g,k”这一行Map处理之后会输出<b-c, a>、<b-e, a>、<b-g, a>、<b-k, a>、<c-e, a>、<c-g, a>、<c-k, a>、<e-g, a>、<e-k, a>、<g-k, a>10个键值对。
Reduce端正式处理数据时因为数据在前面经过了Map端和Reduce端的Shuffle过程处理,此时键值对都是有序的,要处理的数据就是<key, value-list>的形式。只需要重写的reduce( )函数中遍历value-list将里面的用户拼接起来就行了,拼接得到的就是两个用户的共同好友。然后得到的字符串作为新的value,key不变,将键值对写入到最终文件中。比对于<a-b, <e,k>>,Reduce处理之后会得到键值对<a-b, “e,k”>,并将其写入最终文件中。

3.带注解的MapReduce程序

import java.io.IOException;
import java.util.Set;
import java.util.TreeSet;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Friends {
   
	
	//Map处理逻辑具体代码
	public static class FriMap extends Mapper<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值