数据分析之共同好友统计

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

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

文章出处: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

运行效果如下:

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

时间: 2024-11-03 13:05:35

数据分析之共同好友统计的相关文章

优云运维:漫谈redis在运维数据分析中的去重统计方式

今天,我和大家分享下redis在运维数据分析中的去重统计方式.为了避免混淆,本文中对于redis的数据结构做如下约定: SET:saddkey member ZSET:zaddkeyscoremember HYPERLOGLOG:pfaddkeyelement STRING:setbitkeyoffset value 名词约定: 维度:比如版本.操作系统类型.操作系统版本.运营商.设备型号.网络类型等 复合维度:由两个或多个维度交错产生的维度,比如某个版本下的某个设备型号. 去重统计在数据化运维

2011-2012年百度历次大更新数据分析(附:两年数据统计)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 上海SEO潇然孤雁飞在去年11月份继续发表了<<2011年百度大更新时间规律分析>>,<<百度大更新一周趋势分析>>等系列有关百度的文章发表在站长之家,站长论坛,A5论坛,搜外SEO论坛,推一把等知名人气论坛反应极响,曾被站长之家首页周推荐,A5论坛高亮推荐,推一把论坛加精,并被多次转载,其中被卢松松博客转载后的点击率就达7400多人次, 站长之家站长论坛点击率13776人次,因工作的缘故曾一度淡出论坛,今应很

Facebook数据科学家解密数据分析驱动用户增长

本文内容来源于作者在知乎的一场直播,内容关于如何通过数据分析驱动用户增长.由于 Facebook 有严格的保密要求,所以这次直播内容不会透露属于内部消息的数据.产品或者策略.直播里提到的例子如果涉及到 Facebook ,都会是已经公开的信息(一般是 Facebook F8 大会提到过的或者 Engineer blog 上的内容).  先简单介绍一下我自己.我是清华生物系本科和硕士毕业,之后去北卡大学念药物药理学的博士,中间发现自己不适合走生物科研的路,所以在博士开始两年多的时候决定转硕士走人.

产品经理怎么做市场调研和数据分析

产品经理对用户的需求了解有多少呢?你知道用户需要的是什么样的产品吗?你想知道用户将会如何看待你的产品吗?你想知道你设计的产品在用户中的看来是好还是差吗? 毫无疑问的是,每一个产品经理都希望在产品开始立项设计之前,可以得到用户最真实的需求,可以为自己的产品设计提供良好的支撑;每一个产品经理都希望自己的设计的产品得到用户的认可和喜欢;每一个产品经理都希望用户能在使用产品的过程中,对于产品改进的意见和建议可以不断地提出建议--那么,怎么样我们才能得到用户的前期意见和后期反馈呢? 这个时候我们最需要的是

中国企业应用数据分析大概情况和未来趋势

ZDNET至顶网CIO与应用频道 06月05日 北京消息: "大数据"时代到来了么? 潮流是一股可笑又可敬的力量:今天,如果打开任何媒体,要是不提"大数据",恐怕都不好意思出版. 这股潮流,铺天盖地,连国家领导人都不例外. 问题在于:为什么人人言必称大数据? 数据的价值,随着数据量的几何级数增长,已经不再能够通过传统的图表得以显现,这正是为什么商业智能还没来得及流行,便已被"数据分析"挤下舞台.因为,价值隐藏在数据中,需要数据分析方可释放这些价值

CNZZ&quot;站长统计&quot;洞悉用户行为实现网站优化

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 用户行为分析是网站进行优化的基础依据.在用户行为数据的获取和分析方面,借助第三方专业分析工具能获得事半功倍的效果.国内资深数据分析专家CNZZ"站长统计"(面向个人站长)和"全景统计"(面向商家.企业),以数据报表.图文形式多维度展现访客行为特点,特别是 "页面访问轨迹"和"

《R与Hadoop大数据分析实战》一1.1 安装R

1.1 安装R 可以通过访问R的官方网站下载相应的版本.这里提供了对应三种不同操作系统的下载步骤,包括在Windows.Linux和Mac上安装R.下载最新版本的R,其中包括所有最新的补丁和错误解决方案.对于Windows操作系统,请执行以下步骤: 访问www.r-project.org. 点击CRAN,选择CRAN镜像(CRAN mirror),并选择你的Windows操作系统(捆绑到Linux:Hadoop通常在Linux环境下运行). 从镜像中下载最新的R版本. 执行下载的.exe程序,安

数据分析在互联网金融风险管控的应用

本文讲的是数据分析在互联网金融风险管控的应用,互联网的快速发展,给我们的生活带来了诸多便利,也改变了我们的传统生活模式.如同凯文·凯利在<失控>一书中所描述的,网络的出现,宣告着乌合之众登上历史大舞台,原来只能"一将功成万骨枯"的炮灰生命其历程或将从此改变.网络的出现极大改变了社会之间的关系,在这样一个类似于神经网络架构的社会中,无数"神经元"通过传递汇聚信号形成较为统一的"命令"而控制"躯体"的"运动&

如何统计社会化分享(SMO)流量

中介交易 SEO诊断 淘宝客 云主机 技术大厅 Social media optimization(SMO)--社会媒体优化,这是近几年新出现的名词,它的出现带来了一股新的社会化分享潮流.在这种潮流下,小编通过精心的调查.收集与整理,为广大网站主及个人用户呈上一桌丰盛的"社会化分享"大餐,希望大家能从中各取所需,共同推动社会化分享的大潮流~话不多说,进入正题~~ 社会化分享优势? 在SEO称霸的时代,它是网站主统计网站流量的主要来源.进入21世纪,随着SMO概念的引入,更多的人开始关注