【hadoop学习项目】10. 使用多级MR找出两两用户之间的共同好友

0. 项目结构

在这里插入图片描述
在这里插入图片描述

数据内容

刘灵薇	孙初丹,孙听兰,李秋翠,李绿春
王访琴	刘忆翠,钱语芙,钱平蝶
赵雅蕊	刘灵薇,刘雅蕊
王含蕾	钱语芙,李书蕾,李忆翠
钱雅蕊	李秋春,李初丹,孙听蓉
王绿春	李含烟,刘谷丝,孙秋春,钱雅蕊,赵语芙,钱南松,钱绿春,王听兰
刘含玉	赵绿春,王幻珊,刘语芙,赵怜菡,孙绿春,赵从蓉,赵南松,刘幻灵,王忆翠
钱凌瑶	孙诗云,王乐瑶,钱海露,孙从蓉
李含蕾	李从蓉,李从蓉,刘怜菡,钱灵雁
钱幻灵	赵书蕾,赵秋翠,刘幻珊,刘幻灵,刘雪青,钱夏彤,赵含蕾
刘夏彤	刘忆翠,钱诗云,王代曼,李雪青,赵白晴
刘初丹	李涵双,钱诗云,钱怜菡,孙含玉,李含烟,李听蓉,李海露,王涵双,钱凌瑶
李忆翠	钱秋翠,钱书蕾,孙灵薇,王夏彤,刘秋翠,赵从梦
王幻灵	孙幻灵,赵凌瑶,王语芙,刘灵薇,王代荷,王夏彤
孙忆翠	刘灵薇,赵涵双,刘夏彤,李雪青
李幻灵	赵凌瑶,王幻珊
王代曼	赵听白,王怜菡,孙南松,赵从梦,钱忆翠
刘代曼	李秋翠,赵听兰
刘绿春	王听白,赵书蕾,李怜菡,孙白晴,王怜菡,孙海露,赵南松
李听蓉	孙雅蕊,王含蕾
孙绿春	赵从蓉,王傲之,王听兰,赵诗云,李平蝶,孙听白,李忆翠,钱灵薇,王从蓉
王语芙	李听白,李幻灵,孙幻珊,李幻珊,孙秋春,赵谷丝,赵忆翠
王雪青	赵初丹,赵绿春,钱灵薇,赵从梦,王听白
赵访琴	赵访琴,王听白
孙谷丝	赵白晴,赵怜菡,孙秋春,钱幻灵
赵书蕾	李从蓉,王谷丝,赵乐瑶,李绿春,王绿春
刘语芙	王语芙,钱含烟,孙代荷,孙南松,王灵薇,赵雅蕊
孙乐瑶	李平蝶,刘听蓉,王凌瑶,钱绿春
王白晴	刘访琴,刘从梦,李海露
钱幻灵	李代荷,王听兰,赵听兰,刘傲之,王平蝶,钱幻珊,赵平蝶,孙白晴
钱涵双	刘秋翠,钱海露,赵含烟,刘幻珊
赵听蓉	刘初丹,王谷丝,赵幻灵,刘书蕾
孙雪青	钱凌瑶,赵海露,孙语芙
赵乐瑶	赵含烟,王书蕾,孙访琴,孙听兰,孙初丹,王涵双
赵海露	赵书蕾,孙听兰,王从蓉,刘听兰
钱幻灵	王含蕾,刘凌瑶,钱听兰,赵雅蕊,孙听兰,王秋春,李雅蕊,赵访琴,赵夏彤
李灵雁	钱乐瑶,孙平蝶,王代荷,刘雅蕊,刘平蝶,钱从梦,孙代曼,赵雪青
钱诗云	刘南松,刘代荷,李灵雁,李代曼,孙代荷,王秋翠,钱从蓉,钱秋春
赵含烟	刘访琴,孙谷丝,王幻灵,钱白晴,钱灵薇,王夏彤,王灵薇
李南松	刘南松,李夏彤,王语芙,赵秋翠
赵幻灵	刘语芙,李幻灵,孙傲之,钱灵薇,钱从蓉,刘听兰,李忆翠
钱含玉	钱灵薇,钱谷丝,赵代曼,李平蝶,王初丹,赵雪青
李书蕾	刘忆翠,王从蓉
李秋春	孙含玉,刘灵雁,刘绿春,赵秋翠
刘诗云	赵灵薇,刘平蝶,王听兰,赵书蕾,李秋春
刘听蓉	赵凌瑶,王从蓉,刘灵薇,王雅蕊,钱初丹,钱平蝶,孙初丹,李雪青
李白晴	孙绿春,孙含蕾
刘怜菡	刘谷丝,孙含蕾,钱书蕾,赵含蕾,李听蓉,孙灵薇,王海露
刘秋春	刘代荷,王听蓉,王含蕾,孙灵雁,李听蓉,赵代荷,钱绿春,刘忆翠,王忆翠
赵含蕾	孙白晴,孙凌瑶,李白晴,王雪青
孙雪青	王凌瑶,王从蓉
钱灵雁	钱含蕾,王含烟,李诗云,钱诗云,赵从蓉,刘平蝶,孙书蕾
刘代荷	王幻珊,钱雪青,王代曼,王含玉,孙平蝶
赵涵双	钱秋春,李从梦,赵听白,王访琴
刘书蕾	李傲之,孙乐瑶,赵怜菡,孙幻灵
赵幻灵	李凌瑶,李代曼,刘访琴,钱语芙
赵乐瑶	孙傲之,孙乐瑶
孙灵薇	孙代荷,赵访琴,孙绿春,钱乐瑶,刘代荷
刘夏彤	钱代曼,孙代荷,赵灵雁,钱书蕾,赵乐瑶,孙从蓉,刘访琴,孙灵雁
刘诗云	王从蓉,刘绿春,钱诗云,王从蓉,王白晴
李秋春	赵忆翠,刘雪青,刘幻珊,孙从梦,钱海露

思路

  1. 原数据格式: 用户 好友1,好友2,好友3....
  2. 好友对应的用户群: 我们的目标是处理出两两用户之间共同好友,而经过一个Map阶段后数据会被分为<key,value>的形式,而经过Reduce阶段相同的Key所对应的Value值将会合并。因此,可以从反向的思路出发,将好友作为Key,用户作为Value。使用MapReduce后,将会得到一个好友所对应的一群用户,即该好友为这群用户的共同好友。
    数据格式:好友 用户1,用户2,用户3....
    例如
    刘乐瑶	赵乐瑶,李绿春,钱听兰,赵访琴,李听兰,赵诗云,赵白晴
    刘书蕾	钱怜菡,刘代荷,孙秋翠,李秋春,王南松
    
  3. 两两用户之间对应的共同好友: 再根据上述数据,我们要列出两两好友之间的好友,即目标数据格式为用户1_用户2 好友1,好友2,好友3...
    首先,将每个好友对应的用户数据进行处理,处理为用户1_用户2这种格式。
    (注意,先排序后处理。若未排序后处理,可能会出现相同的两个人,因次序不同而成为不同的Key,造成额外计数。在不同好友之间所对应的用户可能会出现这种形式张三_李四李四_张三,会被认为是两种不同的数据,进行额外计数。)再倒回来处理数据,将用户作为Key,好友Value。经过Map阶段后,得到用户1_用户2 好友这种形式的数据。最后经过Reduce阶段,将相同用户1 用户2的Value值进行合并,得到两两好友之间的共同用户,形式为用户1_用户2 好友1,好友2,好友3
    例如
    刘乐瑶_刘乐瑶	王含玉,赵傲之,赵夏彤,刘忆翠
    刘乐瑶_刘书蕾	孙幻灵,赵夏彤,王从梦,刘含蕾,赵夏彤
    

1. Main

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {System.setProperty("HADOOP_USER_NAME", "root");Configuration conf = new Configuration();
//        step1Job job1 = Job.getInstance(conf);job1.setJarByClass(FindFriend.class);job1.setMapperClass(FriendMapper.class);job1.setReducerClass(FriendReducer.class);job1.setOutputKeyClass(Text.class);job1.setOutputValueClass(Text.class);FileInputFormat.setInputPaths(job1,new Path("/hadoop_test/findFriend/friend.txt"));if( Utils_hadoop.testExist(conf,"/hadoop_test/findFriend/result")){Utils_hadoop.rmDir(conf,"/hadoop_test/findFriend/result");}FileOutputFormat.setOutputPath(job1, new Path("/hadoop_test/findFriend/result"));// true表示将运行进度等信息及时输出给用户,false的话只是等待作业结束boolean res1=job1.waitForCompletion(true);//        step1Job job2 = Job.getInstance(conf);job2.setJarByClass(FindFriend.class);job2.setMapperClass(FriendMapper1.class);job2.setReducerClass(FriendReducer1.class);job2.setOutputKeyClass(Text.class);job2.setOutputValueClass(Text.class);FileInputFormat.setInputPaths(job2,new Path("/hadoop_test/findFriend/result"));if( Utils_hadoop.testExist(conf,"/hadoop_test/findFriend/result1")){Utils_hadoop.rmDir(conf,"/hadoop_test/findFriend/result1");}FileOutputFormat.setOutputPath(job2, new Path("/hadoop_test/findFriend/result1"));boolean res2 = job2.waitForCompletion(true);System.exit(res1?0:1);}

2. 处理好友对应的用户群MR

FriendMapper

class FriendMapper  extends Mapper<LongWritable,Text, Text,Text>{@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();// 获取用户 uid孙诗云String uid = line.split("\t")[0];// 获取朋友 friends[钱白晴,李夏彤]String[] friends = line.split("\t")[1].split(",");for (String fre: friends) {// 钱白晴 孙诗云// 李夏彤 孙诗云// 钱白晴 李磊// 钱白晴 王芳// 输出格式: <朋友,用户>context.write(new Text(fre),new Text(uid));}}
}

FriendReducer

class FriendReducer extends Reducer<Text,Text,Text,Text>{@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {StringBuilder sb = new StringBuilder();         // StringBuilder相当于是可以对其进行修改的Stringfor (Text uid: values) {sb.append(uid.toString()).append(",");}String re = sb.substring(0,sb.length()-1);      // 转换成String形式// 朋友1  [用户1,用户2,用户3]// 钱白晴 [孙诗云,李磊,王芳 ]        context.write(key,new Text(re));}
}

输出结果

好友 用户1,用户2,用户3...

刘乐瑶	赵乐瑶,李绿春,钱听兰,赵访琴,李听兰,赵诗云
刘书蕾	钱怜菡,刘代荷,孙秋翠,李秋春,王南松
刘含蕾	赵含玉,刘访琴,李雅蕊,刘幻珊,王南松
刘从蓉	钱听白,孙代荷,李平蝶,孙代荷,王傲之

2. 处理两两用户之间共同好友MR

FriendMapper1

class FriendMapper1 extends Mapper<LongWritable,Text, Text,Text>{@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 朋友1  用户1_用户2// 孙初丹  刘领会_李四_王五String line = value.toString();String[] lines= line.split("\t");//拿到朋友String fri = lines[0];//拿到用户String[] uid = lines[1].split(",");//先对用户进行一个排序,为后期防止出现相同两人因次序不同而带来的重复计算。例如:刘灵会_李四 李四_刘灵会
//        [刘领会,李四,王五]Arrays.sort(uid);// 将所有用户都写成: 用户1_用户2 相同好友  这种形式// 从而输出两两用户之间的共同好友for (int i = 0; i <uid.length-1; i++) {for (int j = i+1; j <uid.length; j++) {context.write(new Text(uid[i]+"_"+uid[j]),new Text(fri));}}}
}

FriendReducer1

class FriendReducer1 extends Reducer<Text,Text,Text,Text>{// 刘能_赵四 孙诗云// 刘能_赵四 李磊// 刘能_赵四 王芳@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {StringBuilder sb = new StringBuilder();// 将两两用户之间的共同好友合并处理后输出for (Text fre:values) {sb.append(fre+",");}String re = sb.substring(0,sb.length()-1);// 刘能_赵四 [孙诗云,李磊,王芳]context.write(new Text(key),new Text(re));}
}

输出结果

用户1_用户2 好友1,好友2,好友3...

刘乐瑶_刘乐瑶	王含玉,赵傲之,赵夏彤,刘忆翠
刘乐瑶_刘书蕾	孙幻灵,赵夏彤,王从梦,刘含蕾,赵夏彤
刘乐瑶_刘从梦	李雪青,刘绿春,孙南松,钱绿春
刘乐瑶_刘从蓉	钱白晴,刘含玉,刘夏彤,刘绿春,钱绿春,刘含蕾,李平蝶,钱幻珊,赵含蕾,刘夏彤
刘乐瑶_刘代曼	李平蝶,李秋翠,王秋翠

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/54839.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022年湖南省高职单招(语文)考试冲刺试题及答案

题库来源&#xff1a;优题宝公众号 2022年湖南省高职单招&#xff08;语文&#xff09;考试冲刺试题及答案&#xff0c;由优题宝公众号根据最新高职单招&#xff08;语文&#xff09;考试大纲与历年高职单招&#xff08;语文&#xff09;考试真题汇总编写&#xff0c;包含高职…

金道科技冲刺科创板:拟募资4.5亿 金言荣家族色彩浓厚

雷递网 雷建平 3月3日报道 浙江金道科技股份有限公司&#xff08;简称&#xff1a;“金道科技”&#xff09;日前递交招股书&#xff0c;准备在创业板上市&#xff0c;计划募资4.5亿元。 其中&#xff0c;3.9亿元用于新能源物流传动机械及液力传动变速箱建设项目&#xff0c;60…

2022年河北省高职单招(语文)考试冲刺试题及答案

题库来源&#xff1a;优题宝公众号 2022年河北省高职单招&#xff08;语文&#xff09;考试冲刺试题及答案&#xff0c;由优题宝公众号根据最新高职单招&#xff08;语文&#xff09;考试大纲与历年高职单招&#xff08;语文&#xff09;考试真题汇总编写&#xff0c;包含高职…

金道科技深交所上市:市值37亿 为金言荣家族企业

雷递网 雷建平 4月13日报道 浙江金道科技股份有限公司&#xff08;简称&#xff1a;“金道科技”&#xff0c;股票代码为&#xff1a;“证券代码&#xff1a;301279”&#xff09;今日在深交所上市。 金道科技此次发行2500万股&#xff0c;发行价为31.20元&#xff0c;募资7.8亿…

Selenium批量查询运动员技术等级

文章目录 问题描述安装代码参考文献 问题描述 2022 西安某宁 3V3 男子单打 A 组 到底有多卷呢&#xff1f; 安装 Python 的 selenium 库 pip install selenium安装 Chrome查看本机Chrome版本号 安装 Chrome 驱动 根据版本号搜谷歌浏览器驱动镜像 或 官方驱动 将解压后的 ch…

​从小样本学习出发,奔向星辰大海

本文为大家带来的演讲主题是&#xff1a;从小样本学习出发&#xff0c;奔向星辰大海。主要分为五个部分&#xff1a; 小样本学习方法及其重要性小样本学习的三个经典场景小样本学习的应用领域小样本学习的定义及难题PaddleFSL助你实现小样本学习 王雅晴&#xff0c;2019年博士毕…

从小样本学习出发,奔向星辰大海

本文为大家带来的演讲主题是&#xff1a;从小样本学习出发&#xff0c;奔向星辰大海。主要分为五个部分&#xff1a; 小样本学习方法及其重要性小样本学习的三个经典场景小样本学习的应用领域小样本学习的定义及难题PaddleFSL助你实现小样本学习 王雅晴&#xff0c;2019年博士…

干货!小样本分子性质预测新方法——性质感知的关系网络

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 分子性质预测能够识别具有目标性质的候选分子&#xff0c;在药物发现中发挥着重要作用。由于新药发现研究中已知药理性质的分子(有标签样本)少&#xff0c;分子性质预测本质上是一个小样本问题&#xff0c;很难…

java实验:使用适当的I/O流类,将电商平台中书籍信息和用户信息分别用文件进行存储

文章目录 前言 一、实验内容 二、实验思路 三、实验代码 四、实验结果截图 总结 前言 好像很久没写点东西了&#xff08; 感觉io流还是有点麻烦的&#xff0c;不过似乎有一套固定的操作&#xff0c;顺着操作下来也八九不离十了 一、实验内容 &#xff08;1&#xff09;…

名帖316 沈尹默 行书《澹静庐诗剩》及《景宁杂诗》

《中国书法名帖目录》 沈尹默&#xff0c;原名君默&#xff0c;祖籍浙江湖州人&#xff0c;1883年生于陕西兴安府汉阴厅(今陕西安康市汉阴县城关镇民主街)早年留学日本&#xff0c;后任北京大学教授和校长、辅仁大学教授。1949年后历任中央文史馆副馆长&#xff0c;上海市人民…

如何使用OpenAI的whisper

文章目录 一、安装ffmpeg二、安装torch等相关组件三、安装Whisper四、下载模型五、测试效果六、cpu与gpu解码的耗时对比参考文献 一、安装ffmpeg yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm yum install ff…

全覆盖路径规划——ccpp

在路径规划方法中&#xff0c;有一种是点到点的路径规划&#xff0c;这一类例如dijstra&#xff0c;或者A*这类算法&#xff0c;关注的是点到点的最短路径&#xff0c;偏向一种最优的选择。还有一种是全覆盖是路径规划&#xff0c;这一类路径规划关注的是遍历整个地图&#xff…

2021高考仙桃中学成绩查询,仙桃2020高考最高分出炉!汇总仙桃各大中学喜报

高考结束&#xff0c; 已经放榜&#xff0c; 不论结果如何&#xff0c;至少曾经放手一搏过&#xff01; 我们来看看仙桃这些高中&#xff0c; 今年的喜报吧&#xff01; 仙桃一中喜报&#xff1a;全市文科最高分 文科刘佳琪652分&#xff0c; 全市文科最高分&#xff0c; 稳居湖…

免费创造你的专属数字人!

现在数字人已经不是什么新鲜事物啦&#xff0c;所谓数字人&#xff08;Digital Human / Meta Human&#xff09;&#xff0c;是运用数字技术创造出来的、与人类形象接近的数字化人物形象。未来数字人ChatGPT可以取代很多现在很多的一些应用场景&#xff0c;例如客服、主播等。以…

运营人常备的8个营销模型一、SWOT分析二、PEST分析三、3C

运营人常备的8个营销模型 一、SWOT分析 二、PEST分析 三、3C战略模型 四、STP理论 五、波特五力模型 六、波士顿矩阵 七、GE矩阵 八、商业模式画布 内容如下&#xff1a; 一、SWOT分析 1.strengths是优势 2.weaknesses是劣势 3.opportunities是机会 4.threats是威胁 二、PEST分…

286 亿元!败了的 Google 是否会为 Android 交最贵罚单?

聚光灯下的 Google&#xff0c;再一次“失利”。 整理 | 苏宓 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 屈指算来&#xff0c;Google 遭到欧盟反垄断调查已有 12 年时间。在此多年间&#xff0c;调查主要是围绕 Google 的搜索引擎、Android、AdWords&#x…

微软正式将GPT-4引入网络安全,安全行业颠覆似乎来了

北京时间3月28日23:30&#xff0c;微软安全开启全球直播&#xff0c;重磅推出Microsoft Security Copilot——正式宣布将GPT-4引入网络安全。 据微软称&#xff0c;Security Copilot将不断学习和改进&#xff0c;提供对最先进的OpenAI模型的持续访问&#xff0c;以支持要求苛刻…

腾讯云数据安全中台保护方案获“首届全国商用密码应用优秀案例”

近日&#xff0c;工业和信息化部密码应用研究中心发起的“首届全国商用密码应用优秀案例”评选活动正式结束&#xff0c;腾讯云数据安全中台保护方案凭借优异技术和实践表现获评优秀案例。 &#xff08;首届全国商用密码应用优秀案例名单) 本次优秀案例征集涵盖电子政务、信息…

阿里贾扬清:新一轮AI爆发的推动机制是工程化和开源 | MEET2023

羿阁 整理自 MEET2023量子位 | 公众号 QbitAI 随着Stable Diffusion、ChatGPT的爆火&#xff0c;AI在今年迎来了大爆发。 这不禁让人想问&#xff0c;这些创新背后的推动机制究竟是什么&#xff1f; 在MEET2023智能未来大会上&#xff0c;阿里巴巴集团副总裁、阿里云计算平台事…

教你在Android手机上使用全局代理!

FBI Warning&#xff1a;欢迎转载&#xff0c;但请标明出处&#xff1a;http://blog.csdn.net/codezjx/article/details/8872071&#xff0c;未经本人同意请勿用于商业用途&#xff0c;感谢支持&#xff01; 前言&#xff1a;在Android上使用系统自带的代理&#xff0c;限制灰常…