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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/xiaohanlin/p/8908124.html

时间: 2024-07-28 23:06:53

hadoop计算二度人脉关系推荐好友的相关文章

根据二度人脉推荐好友sql

friend表结构 DROP TABLE IF EXISTS FRIEND; create table friend( uid        bigint not null comment '用户标识', friend_uid    bigint not null comment '申请加为好友的用户标识', sys_create_date datetime not null comment '申请时间', sys_last_update datetime not null comment '更

朋友圈的人脉关系的算法

大家一起讨论一下啊!最短路径? 1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友的朋友的朋友就是这个陌生人.你们的关系是 你->朋友->朋友->陌生人 4.四度人脉:比三度增加一度,你们的关系是,你->朋友->朋友->朋友->陌生人 5.五度人脉:你->朋友->朋友->朋友->朋友->

基于Spark GraphX计算二度关系

关系计算问题描述 二度关系是指用户与用户通过关注者为桥梁发现到的关注者之间的关系.目前微博通过二度关系实现了潜在用户的推荐.用户的一度关系包含了关注.好友两种类型,二度关系则得到关注的关注.关注的好友.好友的关注.好友的好友四种类型. 如果要为全站亿级用户根据二度关系和四种桥梁类型推荐桥梁权重最高 TopN 个用户,大致估算了下总关系量在千亿级别,按照原有的 Mapreduce 模式计算整个二度关系,需要以桥梁用户为 Key,把它的关注和粉丝两个亿级的表做 Join,如果活跃用户按照亿计,平均关

聪明人都在远离手机虚假繁荣的“人脉”关系

文丨杨奇函 听过这样一个段子:市政协会议散会,几个身价超十亿的老板去打牌,某超市连锁企业的老板同为身家过亿的政协委员,和他们一起开过几次会,也提出去一起玩.煤老板们面面相觑,最后还是首富张嘴说话了:“我们哥几个一起玩,是因为我们都有产业,你一个开小卖店的跟着我们凑什么热闹?”然后在凛冽的秋风中,超市企业老板悻悻地回家了. 我又想起来另一个故事.某哥经常炫耀他跟某女神关系多熟,讲述他们共事的点点滴滴,还把对方设置为特别好友,描述很是亲密.我们都感叹“哇噻,好牛的感觉”.只是我们从来没有见过此女神和

MapReduce实现二度好友关系

一.问题定义 我在网上找了些,关于二度人脉算法的实现,大部分无非是通过广度搜索算法来查找,犹豫深度已经明确了2以内:这个算法其实很简单,第一步找到你关注的人:第二步找到这些人关注的人,最后找出第二步结果中出现频率最高的一个或多个人(频率这块没完成),即完成. 但如果有千万级别的用户,那在运算时,就肯定会把这些用户的follow 关系放到内存中,计算的时候依次查找:先说明下我没有明确的诊断对比,这样做的效果一定没 基于hadoop实现的好:只是自己,想用hadoop实现下,最近也在学:若有不足的地

互联网人如何拓展自己的人脉

平时经常有看到朋友在微信群里问:有认识XX公司的人么?求介绍.或者是在朋友圈里看到:万能的朋友圈啊,能帮忙介绍XX公司的人么?成功介绍发红包. 所以就萌生了这个想法,整理一下互联网人高效找人的方法.本文只是整理一些找人的方法,并不涉及讲述如何拓展关系的层面.想要拥有更深入的人脉关系,更重要的是你要将自己打造成一个好的合作者.下篇里我再讲讲互联网商务喜欢怎样的合作.    一.找人过程中的三大原则    互惠原则 请抱着互惠原则去找人.别人的时间也是宝贵的,请别人帮忙时,抱着感恩的心.可以给他发个

互联网人如何拓展自己的人脉(上)

平时经常有看到朋友在微信群里问:有认识XX公司的人么?求介绍.或者是在朋友圈里看到:万能的朋友圈啊,能帮忙介绍XX公司的人么?成功介绍发红包. 所以就萌生了这个想法,整理一下互联网人高效找人的方法.本文只是整理一些找人的方法,并不涉及讲述如何拓展关系的层面.想要拥有更深入的人脉关系,更重要的是你要将自己打造成一个好的合作者.下篇里我再讲讲互联网商务喜欢怎样的合作.    一.找人过程中的三大原则    互惠原则 请抱着互惠原则去找人.别人的时间也是宝贵的,请别人帮忙时,抱着感恩的心.可以给他发个

“人脉投资”你真的做对了吗?

文/明道副总裁  许维 公众号/xuwei0418 谁都知道人脉很重要,所以有些人非常勤奋的"做人脉",他们往往会这样做-- 积极的参与各类线下活动,逢人就换名片.加微信. 见到名人或者重要人物必合影,而且他们还会掏出手机来给你看. 逢年过节,给所有他觉得重要的人发一条相同的祝福微信,比较有心的会在复制的时候改一下前面的名字,以示重视. 动不动喜欢拉一个微信群,名字一般叫什么"XX行业精英群",每天早晨准时在群里说早安.发心灵鸡汤. 和你聊天的时候,会本能的提及他&

为什么你还把时间浪费在无效人脉社交上?

有两项技能是一个人终身受用的,第一是学习,第二就是社交. 谁都知道人脉很重要,所以有些人非常勤奋的“做人脉”:他们往往会这样做——积极的参与各类线下活动,逢人就换名片.加微信.可是这样的做法往往非常不讨喜. 在这个大数据时代里,圈子小到你意想不到,口碑传播的速度也快到你意想不到.还在做无效的“人脉”?你该看看真正懂人脉的人是怎么做的. 反面教材往往是这样的: 见到名人或者重要人物必合影,而且他们还会掏出手机来给你看. 逢年过节,给所有他觉得重要的人发一条相同的祝福微信,比较有心的会在复制的时候改