数据分析之共同好友统计

简介: --------------------------------------------------------------------------------------------------------------- [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/51646916

---------------------------------------------------------------------------------------------------------------

[版权申明:本文系作者原创,转载请注明出处]

文章出处:http://blog.csdn.net/sdksdk0/article/details/51646916

作者:朱培

---------------------------------------------------------------------------------------------------------------

今天主要分享一个统计共同好友的案例,非常简单也非常实用的一个小案例,对于数据分析初级开发人员是很好的入门资料。

下面先来看一下原始数据:

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,D,F,E,O,B的好友有A、C、E、K,其他的按理类推。其中:用户和好友之间在这里以冒号分隔开,好友之间用逗号隔开。


当我们拿到这段数据的时候,该如何下手呢?

首先可以先两两合并为一组,然后找有相同的元素。例如可以分为AB、AC、AD、BC、BD.....等

找共同好友就是可以把AB求交集,然而这种方法在这里是不太可行的,那么我们可以逆向思维,反过来找,

例如找到第一行,B是A的朋友,C是A的朋友,然后就可以有K、V。

在A:B,C,D,F,E,O中B是A的朋友,在F:A,B,C,D,E,O,M中,B是F的朋友,则我们就可以认为A和F的共同好友是B,以这个B为K,依次类推。

则A是BDFGHIKO的共同好友    
B是AEFJ,的共同好友

C是ABEFGHK的共同好友

D是ACEFGHKL的共同好友

即当一个mapper执行结束后悔得到上面这些结果,然后再来一个mapreduce。


得到两两之间应该共同好友:

A:BD-A BF-A BG-A BH-A BI-A BK-A BO-A

B: AE-B AF-B AJ-B

C: AB-C AE-C AF-C ... BF-C BG-C  BH-C  ...

依次类推,这样就得到了共同好友了!


接下来用代码来实现:


String line=value.toString();   //一行行的读取数据
			String[] split=line.split(":");  //把读到的数据切分开,前面说过的用冒号分开好友
			String person=split[0];     //自己就是分开的数组的第0位
			
			String[] friends=split[1].split(",");   //好友是数组的第1位,而且以逗号隔开的

下面循环这些值,并写入到Text中:

			for(String f:friends){
				context.write(new Text(f), new Text(person));
			}


然后提交给reduce来执行:再来一个循环和写入。

StringBuffer sb=new  StringBuffer();
			
			for(Text person:persons){
				sb.append(person+",");
			}
			context.write(friend, new Text(sb.toString()));
		}

最后在main方法中调用map和reduce。

//指定本job使用的mapper类
				wcjob.setMapperClass(CommonFriendsOneMapper.class);
				//指定本job使用的reducer类
				wcjob.setReducerClass(CommonFriendsOneReducer.class);

完整代码如下:

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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;

public class CommonFriendsOne {
	
	
	public static class CommonFriendsOneMapper extends Mapper<LongWritable, Text, Text, Text> {

		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			
			String line=value.toString();
			String[] split=line.split(":");
			String person=split[0];
			
			String[] friends=split[1].split(",");
			
			for(String f:friends){
				context.write(new Text(f), new Text(person));
			
			}
		}
	}
	public static class CommonFriendsOneReducer extends Reducer<Text, Text, Text, Text> {

		// 输入<B->A><B->E><B->F>....
		// 输出 B A,E,F,J
		@Override
		protected void reduce(Text friend, Iterable<Text> persons, Context context) throws IOException, InterruptedException {
			StringBuffer sb=new  StringBuffer();
			
			for(Text person:persons){
				sb.append(person+",");
			}
			context.write(friend, new Text(sb.toString()));
		}
	}
	
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		//读取classpath下的所有xxx-site.xml配置文件,并进行解析
				Configuration conf = new Configuration();
				
				Job wcjob = Job.getInstance(conf);
				
				//通过主类的类加载器机制获取到本job的所有代码所在的jar包
				wcjob.setJarByClass(CommonFriendsOne.class);
				
				//指定本job使用的mapper类
				wcjob.setMapperClass(CommonFriendsOneMapper.class);
				//指定本job使用的reducer类
				wcjob.setReducerClass(CommonFriendsOneReducer.class);
				
				
				//指定reducer输出的kv数据类型
				wcjob.setOutputKeyClass(Text.class);
				wcjob.setOutputValueClass(Text.class);
				
				//指定本job要处理的文件所在的路径
				FileInputFormat.setInputPaths(wcjob, new Path(args[0]));
				//指定本job输出的结果文件放在哪个路径
				FileOutputFormat.setOutputPath(wcjob, new Path(args[1]));
				
				//将本job向hadoop集群提交执行
				boolean res = wcjob.waitForCompletion(true);
				
				System.exit(res?0:1);

	}

}

可以按照我之前博文的方法:将这个文件打成一个jar包,然后提交到hadoop集群中运行。

在hadoop中新建数据文件和目录。

 bin/hadoop fs -mkdir -p /friends/data

然后上传源数据

 bin/hadoop fs -put ../lx/data.txt  /friends/data

执行jar

bin/hadoop jar ../lx/friends.jar  cn.tf.friends.CommonFriendsOne  /friends/data  /friends/output

查看执行情况:

bin/hadoop fs -cat /friends/output/part-r-00000

运行效果如下:


到这里整个流程就分析完毕了。


目录
相关文章
|
机器学习/深度学习 数据采集 数据可视化
R语言 一种功能强大的数据分析、统计建模 可视化 免费、开源且跨平台 的编程语言
R语言 一种功能强大的数据分析、统计建模 可视化 免费、开源且跨平台 的编程语言
467 1
|
7月前
|
文字识别 算法 数据挖掘
视觉智能开放平台产品使用合集之对于统计研究和数据分析,有哪些比较好的工具推荐
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
8月前
|
数据可视化 前端开发 数据挖掘
R语言对综合社会调查GSS数据进行自举法bootstrap统计推断、假设检验、探索性数据分析可视化|数据分享(上)
R语言对综合社会调查GSS数据进行自举法bootstrap统计推断、假设检验、探索性数据分析可视化|数据分享
|
7月前
|
机器学习/深度学习 数据可视化 算法
探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)
探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)
73 0
|
8月前
|
机器学习/深度学习 数据可视化 数据挖掘
用Python进行健康数据分析:挖掘医疗统计中的信息
【4月更文挑战第12天】Python在医疗健康数据分析中扮演重要角色,具备数据处理、机器学习、可视化及丰富生态的优势。基本流程包括数据获取、预处理、探索、模型选择与训练、评估优化及结果可视化。应用案例包括疾病预测、药物效果分析和医疗资源优化,例如使用RandomForestClassifier进行疾病预测,Logit模型分析药物效果,以及linprog优化医疗资源配置。
865 1
|
8月前
|
前端开发 数据可视化 数据挖掘
R语言对综合社会调查GSS数据进行自举法bootstrap统计推断、假设检验、探索性数据分析可视化|数据分享(下)
R语言对综合社会调查GSS数据进行自举法bootstrap统计推断、假设检验、探索性数据分析可视化|数据分享
|
8月前
|
存储 数据采集 数据挖掘
python数据分析——数据分类汇总与统计
数据分类汇总与统计是指将大量的数据按照不同的分类方式进行整理和归纳,然后对这些数据进行统计分析,以便于更好地了解数据的特点和规律。
417 1
|
8月前
|
机器学习/深度学习 算法 数据挖掘
python数据分析——数据分析的统计推断
数据分析的统计推断是科学研究中的重要环节,它通过对样本数据的分析,对总体参数进行估计,并对假设进行检验。这一过程旨在从数据中提取有意义的信息,为决策提供科学依据。 在统计推断中,我们通常会遇到两类问题:参数估计和假设检验。参数估计是通过样本数据对总体参数进行点估计或区间估计。点估计是对总体参数的具体数值进行预测,而区间估计则是给出一个包含总体参数的置信区间。这两种估计方法都基于大数定律和中心极限定理,保证了估计的准确性和可靠性。
102 0
|
算法 数据挖掘 API
贝叶斯统计在Python数据分析中的高级技术点:贝叶斯推断、概率编程和马尔科夫链蒙特卡洛
贝叶斯统计在Python数据分析中的高级技术点:贝叶斯推断、概率编程和马尔科夫链蒙特卡洛
134 1
贝叶斯统计在Python数据分析中的高级技术点:贝叶斯推断、概率编程和马尔科夫链蒙特卡洛
|
数据采集 数据挖掘 索引
pandas数据分析之数据运算(逻辑运算、算术运算、统计运算、自定义运算)
数据分析离不开数据运算,在介绍完pandas的数据加载、排序和排名、数据清洗之后,本文通过实例来介绍pandas的常用数据运算,包括逻辑运算、算术运算、统计运算及自定义运算。
495 0

热门文章

最新文章