hadoop计算二度人脉关系推荐好友
https://www.jianshu.com/p/8707cd015ba1
问题描述:
以下是qq好友关系,进行好友推荐,比如:老王和二狗是好友 , 二狗和春子以及花朵是好友,那么老王和花朵 或者老王和春子就有可能也认识,可以对老王推荐春子和或花朵作为好友。
注意以下是制表符:tab建,所以程序中用 /t进行分割
老王 二狗
老王 二毛
二狗 春子
二狗 花朵
老王 花朵
花朵 老王
春子 菊花
问题分析
问题分析:
主 ---> 从
从 --->主
分别列出每一个关系,然后都列出从-->主
这样去重后每个人可以有一个关系集合,然后对这个集合中的每个元素求笛卡尔积,记得到可能的关系
比如:
老王 -->二狗
二狗--->老王
这是一对主从 从主
然后:可以对二狗求出一个集合
如下进行全面列出:
老王 二狗
二狗 老王
二狗 春子
二狗 花朵
这样 二狗进行合并后就是 老王 春子 和 花朵 组成一个集合,然后对集合中的每个元素求笛卡尔积即可
编程实现:
mapper实现 分离主 从 从 主
package com.topwqp.mr;
import java.io.IOException;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
public class QQMapper extends Mapper<LongWritable,Text,Text,Text>{
@Override
protected void map(LongWritable key, Text value,
Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
// TODO Auto-generated method stub
String line = value.toString();
//通过制表符进行分割
String[] lineDatas = line.split("\t");
context.write(new Text(lineDatas[0]), new Text(lineDatas[1]));
context.write(new Text(lineDatas[1]), new Text(lineDatas[0]));
}
}
reduce实现去重和笛卡尔积
package com.topwqp.mr;
import java.io.IOException;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.io.Text;
import java.util.*;
public class QQReduce extends Reducer<Text,Text,Text,Text>{
@Override
protected void reduce(Text key, Iterable<Text> i,
Reducer<Text, Text, Text, Text>.Context context) throws IOException,
InterruptedException {
// TODO Auto-generated method stub
//首先进行去重
Set<String> set = new HashSet<String>();
for(Text t:i){
set.add(t.toString());
}
//每个元素都拿出来,计算笛卡尔积 如果只有一个元素,就不用求笛卡尔积,直接列出即可
if(set.size()>1){
for(Iterator j = set.iterator();j.hasNext();){
String name =(String)j.next();
for (Iterator k = set.iterator(); k.hasNext();) {
String other = (String) k.next();
//排除自己
if(!name.equals(other)){
context.write(new Text(name), new Text(other));
}
}
}
}
}
}
JobRun编写
package com.topwqp.mr;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class QQJobRun {
public static void main(String[] args) {
//configuration中配置的key value和 配置文件下的conf/mapred-site.xml保持一致
Configuration conf = new Configuration();
conf.set("mapred.job.tracker", "localhost:9001");
conf.addResource(new Path("/Users/wangqiupeng/Documents/xplan/bigdata/hadoop-1.2.1/conf/core-site.xml"));
conf.addResource(new Path("/Users/wangqiupeng/Documents/xplan/bigdata/hadoop-1.2.1/conf/hdfs-site.xml"));
conf.set("mapred.jar", "/Users/wangqiupeng/Downloads/qq.jar");
try{
Job job = new Job(conf);
job.setJobName("qq");
//当前类是运行入口
job.setJarByClass(QQJobRun.class);
//mapper类
job.setMapperClass(QQMapper.class);
//reducer类
job.setReducerClass(QQReduce.class);
//最终统计结果输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setNumReduceTasks(1);//设置reduce任务的个数,默认是一个
//mapreduce 输入数据所在的目录或者文件
FileInputFormat.addInputPath(job, new Path("/Users/wangqiupeng/Documents/xplan/bigdata/data/hadoop-1.2.1/input/qq/"));
//mapreduce执行之后的输出数据的目录 这个输出路径的部分目录可以没有,如果没有会自动创建
FileOutputFormat.setOutputPath(job, new Path("/Users/wangqiupeng/Documents/xplan/bigdata/data/hadoop-1.2.1/output/qq/"));
//等待job完成退出
System.exit(job.waitForCompletion(true) ? 0 :1);
}catch(Exception e){
e.printStackTrace();
}
}
}
执行结果:
作者:topwqp
链接:https://www.jianshu.com/p/8707cd015ba1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
hadoop计算二度人脉关系推荐好友的更多相关文章
- 海量数据的二度人脉挖掘算法(Hadoop 实现)
最近做了一个项目,要求找出二度人脉的一些关系,就好似新浪微博的“你可能感兴趣的人” 中,间接关注推荐:简单描述:即你关注的人中有N个人同时都关注了 XXX . 在程序的实现上,其实我们要找的是:若 U ...
- 依据二度人脉推荐好友sql
friend表结构 DROP TABLE IF EXISTS FRIEND; create table friend( uid bigint not null comment ' ...
- 使用MapReduce实现二度人脉搜索算法
一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...
- 基于Spark GraphX计算二度关系
关系计算问题描述 二度关系是指用户与用户通过关注者为桥梁发现到的关注者之间的关系.目前微博通过二度关系实现了潜在用户的推荐.用户的一度关系包含了关注.好友两种类型,二度关系则得到关注的关注.关注的好友 ...
- MapReduce实现二度好友关系
一.问题定义 我在网上找了些,关于二度人脉算法的实现,大部分无非是通过广度搜索算法来查找,犹豫深度已经明确了2以内:这个算法其实很简单,第一步找到你关注的人:第二步找到这些人关注的人,最后找出第二步结 ...
- Hadoop MapReduce实现人员二度关系运算
1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...
- Spark 计算人员二度关系
1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...
- <转>“人脉投资”的10条建议
谁都知道人脉很重要,所以有些人非常勤奋的“做人脉”,他们往往会这样做—— 积极的参与各类线下活动,逢人就换名片.加微信. 见到名人或者重要人物必合影,而且他们还会掏出手机来给你看. 逢年过节,给所有他 ...
- [转帖]Hadoop、Hive、Spark 之间关系
Hadoop.Hive.Spark 之间关系 https://www.cnblogs.com/jins-note/p/9513426.html 很的很诙谐有趣. 作者:Xiaoyu Ma ,大数据工程 ...
随机推荐
- Deep Learning 学习笔记(4):Logistic Regression 逻辑回归
逻辑回归主要用于解决分类问题,在现实中有更多的运用, 正常邮件or垃圾邮件 车or行人 涨价or不涨价 用我们EE的例子就是: 高电平or低电平 同时逻辑回归也是后面神经网络到深度学习的基础. (原来 ...
- Linux quota命令参数及用法详解---Linux磁盘配额限制设置和查看命令
功能说明:显示磁盘已使用的空间与限制. 语 法:quota [-quvV][用户名称...] 或 quota [-gqvV][群组名称...] 补充说明:执行quota指令,可查询磁盘空间的限制,并得 ...
- Visual Studio 2005 C# 读写Excel文件
做作业的时候查了一点儿资料, 用的vs2k5 读 excel 发现用起来非常简单...现在编程语言没话说! 项目-添加引用-COM-Microsoft Excel 12.0 Object Librar ...
- java8新特性-lambda表达式和stream API的简单使用
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- Educational Codeforces Round 45 (Rated for Div. 2)
A bracket sequence is a string containing only characters "(" and ")". A regular ...
- kibana-4.6.3-linux-x86_64.tar.gz的下载(图文详解)
对于Kibana ,我们知道,是Elasticsearch/Logstash/Kibana的必不可少成员. 第一步:进入Elasticsearch的官网 https://www.elastic.co/ ...
- 刷题向》DP》放苹果 (normal)
这篇博客可能字数比较多,而且很难讲清楚,我会努力给你们讲清楚: 首先,放苹果是一道DP,之所以难,是因为很难想到,我的确有同学用三维数组做出来,然而三维的的确比二维好理解,但三维复杂度太高,虽然DP一 ...
- TOP命令 详解CPU 查看多个核心的利用率按1
top命令是linux下常用的工具,可以查看各个进程的CPU使用情况.先看一个实例: 这是Ramnode双核VPS的top显示结果: 左上角可以看到CPU的使用率是11.3%,但是看下面的进程,plu ...
- Docker学习笔记_安装和使用Redis
一.准备 1.宿主机OS:Win10 64位 2.虚拟机OS:Ubuntu18.04 3.操作账号:Docker 二.安装过程 1.搜索Redis su ...
- BOOL运算符号(从C#入门经典第五版中摘录)
只总结自己觉得难的哈: (1) var1=!var2; //(非) (2) var1=var2&var3; //(与) (3)var1=var2|var3; //(或) (4 ...