mysql共同好友_Hadoop实例之寻找博客中共同好友

这篇博客展示了如何利用MapReduce解决一个社交网络问题,找出用户之间的共同好友。通过两个步骤,首先获取每个用户的好友列表,然后找出两两用户之间有哪些共同的好友,并列出这些共同好友。示例代码在Hadoop上运行,处理的数据格式为用户:其好友列表。最终输出展示了各个用户对之间共享的朋友关系。
摘要由CSDN通过智能技术生成

以下是博客的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的)

求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?

A:B,C,D,F,E,O

B:A,C,E,K

C:F,A,D,I

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

首先要求出A、B、C、….等是谁的好友

packagemapreduce;importjava.io.IOException;importjava.net.URI;importjava.net.URISyntaxException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;/***

*@author* 2019.9.3

* 找到博客中共同好友 第一步 得到ABC...是谁的好友

**/

public classFindFriend {public static class FindFriendsMapper extends Mapper{public static Text peoples = new Text(); //定义输出键

public static Text friends = new Text();//定义输出值

@Overrideprotected void map(LongWritable key, Text value, Mapper.Context context)throwsIOException, InterruptedException {

String line= value.toString(); //读取数据并转为字符串 数据样例为A:B,C,D,F,E,O

String array[] = line.split(":"); //处理数据,先根据:将字符串分为两部分存入数组

String friend[]=array[1].split(",");//处理后一部分字符串,根据,分割并存入数组friend

for(int i=0;i

{

peoples.set(friend[i]);//以样例为例,将A的好友B当做输出键

friends.set(array[0]);//将A做为输出值

context.write(peoples,friends);//该样例键值对key:B value 含义即为B是A的好友

}

}

}public static class FindFriendsReduce extends Reducer{

@Overrideprotected void reduce(Text key, Iterable values, Reducer.Context context)throwsIOException, InterruptedException {

String friend="";//定义一个字符串用来拼接最终结果

for (Text value : values) {//循环values,拼接字符串,即可得到以该键值如B为好友的所有值

friend=friend+value+",";

}

context.write(key,new Text(friend));//写入

}

}public static voidmain(String[] args)throwsIOException, ClassNotFoundException, InterruptedException, URISyntaxException {final String INPUT_PATH = "hdfs://192.168.68.130:9000/user/hadoop/blogfriend.txt";//读入文件地址

final String OUTPUT_PATH = "hdfs://192.168.68.130:9000/user/hadoop/output";//输出文件地址,output不能存在

Configuration conf= newConfiguration();final FileSystem fileSystem = FileSystem.get(newURI(INPUT_PATH), conf);if (fileSystem.exists(newPath(OUTPUT_PATH))) {

fileSystem.delete(new Path(OUTPUT_PATH), true);

}

Job job= Job.getInstance(conf, "Find_Friend");//设置一个用户定义的job名称

job.setJarByClass(Find_Friend.class);

job.setMapperClass(FindFriendsMapper.class); //为job设置Mapper类

job.setReducerClass(FindFriendsReduce.class); //为job设置Reducer类

job.setOutputKeyClass(Text.class); //为job的输出数据设置Key类

job.setOutputValueClass(Text.class); //为job输出设置value类

FileInputFormat.addInputPath(job,newPath(INPUT_PATH));

FileOutputFormat.setOutputPath(job,newPath(OUTPUT_PATH));

System.exit(job.waitForCompletion(true) ? 0 : 1); //运行job

}

}

该段程序运行完成后,得到的结果应为:

A I,K,C,B,G,F,H,O,D,

B A,F,J,E,

C A,E,B,H,F,G,K,

D G,C,K,A,L,F,E,H,

E G,M,L,H,A,F,B,D,

F L,M,D,C,G,A,

G M,

H O,

I O,C,

J O,

K B,

L D,E,

M E,F,

O A,H,I,J,F,

接下来来进行第二步,得到哪些人两两之间有共同好友,及他俩的共同好友都有谁

packagemapreduce;importjava.io.IOException;importjava.net.URI;importjava.net.URISyntaxException;importjava.util.HashSet;importjava.util.Set;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public classFind_Friend {public static class FindFriendsMapper extends Mapper{public static Text peoples = new Text();//定义输出键

public static Text friends = new Text();//定义输出值

@Overrideprotected void map(LongWritable key, Text value, Mapper.Context context)throwsIOException, InterruptedException {

String line= value.toString();//读入文件,得到样例字符串为A I,K,C,B,G,F,H,O,D,

String array[] = line.split(" ");//处理字符串并存入数组

String friend[]=array[1].split(",");//处理字符串并存入数组//循环得到某两个具有共同好友的人,以及他们的共同好友是谁 如:I,K共同好友为A I,C共同好友为A

for(int i=0;i

{for(int j=i+1;j

{

Set set = new HashSet();//这里定义一个hashset类型的数组,向hashset数组中存入数据时,会自动按照哈希数进行排序,这样就避免了如A-C,C-A的重复//将具有共同好友的两个人存入数组

set.add(friend[i]);

set.add(friend[j]);

peoples.set(set.toString());

friends.set(array[0]);

context.write(peoples,friends);//写入

}

}

}

}public static class FindFriendsReduce extends Reducer{

@Overrideprotected void reduce(Text key, Iterable values, Reducer.Context context)throwsIOException, InterruptedException {

String friend="";for(Text value : values) {

friend=friend+value+" ";

}

context.write(key,newText(friend));

}

}public static voidmain(String[] args)throwsIOException, ClassNotFoundException, InterruptedException, URISyntaxException {final String INPUT_PATH = "hdfs://192.168.68.130:9000/user/hadoop/output/part-r-00000";//地址为第一步输出的文件地址

final String OUTPUT_PATH = "hdfs://192.168.68.130:9000/user/hadoop/output8";

Configuration conf= newConfiguration();final FileSystem fileSystem = FileSystem.get(newURI(INPUT_PATH), conf);if (fileSystem.exists(newPath(OUTPUT_PATH))) {

fileSystem.delete(new Path(OUTPUT_PATH), true);

}

Job job= Job.getInstance(conf, "Find_Friend");//设置一个用户定义的job名称

job.setJarByClass(Find_Friend.class);

job.setMapperClass(FindFriendsMapper.class); //为job设置Mapper类

job.setReducerClass(FindFriendsReduce.class); //为job设置Reducer类

job.setOutputKeyClass(Text.class); //为job的输出数据设置Key类

job.setOutputValueClass(Text.class); //为job输出设置value类

FileInputFormat.addInputPath(job,newPath(INPUT_PATH));

FileOutputFormat.setOutputPath(job,newPath(OUTPUT_PATH));

System.exit(job.waitForCompletion(true) ? 0 : 1); //运行job

}

}

得到的结果最终结果为:

[A, B] C E

[A, C] D F

[A, D] F E

[A, E] B D C

[A, F] C B O D E

[A, G] F D E C

[A, H] D O E C

[A, I] O

[A, J] O B

[A, K] D C

[A, L] E D F

[A, M] F E

[B, C] A

[B, D] E A

[B, E] C

[B, F] E A C

[B, G] C A E

[B, H] E C A

[B, I] A

[B, K] C A

[B, L] E

[B, M] E

[B, O] A

[C, D] F A

[C, E] D

[C, F] D A

[C, G] D F A

[C, H] A D

[C, I] A

[C, K] D A

[C, L] D F

[C, M] F

[C, O] I A

[D, E] L

[D, F] A E

[D, G] E A F

[D, H] E A

[D, I] A

[D, K] A

[D, L] E F

[D, M] E F

[D, O] A

[E, F] B M D C

[E, G] D C

[E, H] D C

[E, J] B

[E, K] D C

[E, L] D

[F, G] C D A E

[F, H] A E O C D

[F, I] O A

[F, J] O B

[F, K] A C D

[F, L] E D

[F, M] E

[F, O] A

[G, H] A D E C

[G, I] A

[G, K] C A D

[G, L] F D E

[G, M] F E

[G, O] A

[H, I] A O

[H, J] O

[H, K] A D C

[H, L] D E

[H, M] E

[H, O] A

[I, J] O

[I, K] A

[I, O] A

[K, L] D

[K, O] A

[L, M] F E

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值