hadoop2.5.2学习13-MR之新浪微博-DF的实现
本文接上篇hadoop2.5.2学习13-MR之新浪微博TF-IDF算法简介
上篇微博实现了第一个mappreduce, 统计的词频TF和微博总数N
本文将统计DF,即每个词条在多少个文章中出现。我们只需要对一个mapreduce的输出结果的词频数进行统计,就可以得到DF
主要是读取一个的mapreduce的四个文件, 从中区分TF数据的三个文件
通过获取Filesplit碎片段,
FileSplit fileSplit = (FileSplit) context.getInputSplit();
因为在mapreduce中原始数据会拆分成split作为map的输入数据,
反过来, 每个map都有一个split与之对应, 而且每个split都属于一个文件,
那么通过对split进行过滤,不考虑split为part-r-00003, 及微博总数统计的那个输出文件,就可以的到其他三个文件。
package com.chb.weibo2;import java.io.IOException;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
/*** 统计idf* 输入数据:w+"_"+id*/
public class SecondMapper extends Mapper<Text, Text, Text, IntWritable>{@Overrideprotected void map(Text key, Text value, Context context)throws IOException, InterruptedException {FileSplit fileSplit = (FileSplit) context.getInputSplit();/*** 第一个的MR的输出分四个reduce,生成四个文件,在自定义分区中,最后一个分区是计算微博总数* */if (!fileSplit.getPath().getName().equals("part-0003")) {if (key.toString().split("_").length == 2 ) {String w = key.toString().split("_")[0];String id = key.toString().split("_")[1];context.write(new Text(w), new IntWritable(1));}}}
}
在reduce中就是进行统计求和
package com.chb.weibo2;import java.io.IOException;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;public class SecondReducer extends Reducer<Text, IntWritable, Text, IntWritable>{@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException {int sum = 0;for (IntWritable iw : values) {sum += iw.get();}context.write(key, new IntWritable(sum));}
}
执行代码:
package com.chb.weibo2;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class SecondRunJob {public static void main(String[] args) throws Exception {System.setProperty("HADOOP_USER_NAME", "chb");Configuration conf = new Configuration();FileSystem fs = FileSystem.get(conf);Job job = Job.getInstance();job.setJobName("SecondRunJob");job.setJar("C:\\Users\\12285\\Desktop\\weibo.jar");job.setJarByClass(SecondRunJob.class);job.setMapperClass(SecondMapper.class);job.setReducerClass(SecondReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setInputFormatClass(KeyValueTextInputFormat.class);Path in = new Path("/user/chb/output/outweibo1");FileInputFormat.addInputPath(job, in);Path out = new Path("/user/chb/output/outweibo2");if (fs.exists(out)) {fs.delete(out, true);}FileOutputFormat.setOutputPath(job, out);boolean f = job.waitForCompletion(true);if (f) {System.out.println("第二次job执行完成。。。");}}
}
DF统计结果:
统计出每个词条的DF, 即在多少篇微博中出现过。
些 1
亢奋 2
交易 1
交易日 2
交给 1
亦 1
产品 4
享 14
享受 6
享用 7
京东 1
亮 1
亮相 7
亲 10
亲子 2
亲密 1
3第三个mapreduce, 计算词条权重
经过第一个mapreduce计算出TF, N
第二个mapreduce计算出DF
在这三个数据中,TF数据最多, 如果TF数据达到T级别, 每个分片1G, 也需要上千个mapTask,
要加载上千次N和DF数据, 这是非常耗资源的,
首先N和DF的数据很小, N只有一条数据, 词库的常用词不多, DF那就不大,
我们将小表加载到缓存中,
//将小表加载到内存中,微博总数job.addCacheFile(new Path("/user/chb/output/weibo1/part-r-00003").toUri());//dfjob.addCacheFile(new Path("/user/chb/output/weibo1/part-r-00001").toUri());
在map的setup方法中读取,setup 对每个mapTask只执行一次, 进行初始化。
//通过使用DistributedCache ,将微博总数,和DF统计的文件读入内存中,以map的形式存储HashMap<String, Integer> countMap = null;HashMap<String, Integer> dfMap = null;@Overrideprotected void setup(Context context)throws IOException, InterruptedException {//通过contex获取存在缓存中的文件的uriURI[] uris = context.getCacheFiles();if (uris != null) {for (URI uri : uris) {//如何读取文件内容?BufferedReader br = new BufferedReader(new FileReader(uri.getPath())); if (uri.getPath().endsWith("part-r-00003")) {//获取微博总数的文件countMap = new HashMap<String, Integer>();//统计微博总数的文件中只有一行, count 数量String line = br.readLine();if (line.startsWith("count")) {countMap.put("count", Integer.parseInt(line.split("\t")[1]));}}else if(uri.getPath().endsWith("part-r-00000")){//获取df文件String line = br.readLine();//line: word 在多少个文章中出现String word = line.split("\t")[0];String count = line.split("\t")[1];dfMap.put(word, Integer.parseInt(count));}br.close();}}}
上面的代码有问题,一直报错 /user/chb/output/outweibo1/part-r-00003
不存在,
我将获取path的那行单独出来, 就可以了,但是没有明白为什么。
//如何读取文件内容?if (uri.getPath().endsWith("part-r-00003")) {//获取微博总数的文件Path path = new Path(uri.getPath());BufferedReader br = new BufferedReader(new FileReader(path.getName())); countMap = new HashMap<String, Integer>();//统计微博总数的文件中只有一行, count 数量String line = br.readLine();if (line.startsWith("count")) {countMap.put("count", Integer.parseInt(line.split("\t")[1]));}br.close();}
reduce
reduce就简单了, 只是将每篇微博的各个词条的权重以此输出:
package com.chb.weibo3;import java.io.IOException;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;public class LastReducer 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 text : values) {sb.append(text.toString()+"\t");}context.write(key, new Text(sb.toString()));}
}
执行程序
package com.chb.weibo3;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class LastRunJob {public static void main(String[] args) throws Exception {System.setProperty("HADOOP_USER_NAME", "chb");Configuration conf = new Configuration();FileSystem fs = FileSystem.get(conf);Job job = Job.getInstance();job.setJar("C:\\Users\\12285\\Desktop\\weibo3.jar");job.setJarByClass(LastRunJob.class);job.setJobName("LastRunJob");job.setMapperClass(LastMapper.class);job.setReducerClass(LastReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);job.setInputFormatClass(KeyValueTextInputFormat.class);//将小表加载到内存中,微博总数job.addCacheFile(new Path("hdfs://TEST:9000/user/chb/output/outweibo1/part-r-00003").toUri());//dfjob.addCacheFile(new Path("hdfs://TEST:9000/user/chb/output/outweibo2/part-r-00000").toUri());FileInputFormat.addInputPath(job, new Path("hdfs://TEST:9000/user/chb/output/outweibo1/"));Path out = new Path("hdfs://TEST:9000/user/chb/output/outweibo3/");if (fs.exists(out)) {fs.delete(out, true);}FileOutputFormat.setOutputPath(job, out);boolean f = job.waitForCompletion(true);if (f) {System.out.println("最后一个mapreduce执行完成");}}
}
结果如下:
3823890201582094 我:7.783640596221253 香喷喷:12.553286978683289 多:7.65728279297819 睡:8.713417653379183 豆浆:13.183347464017316 早晨:8.525359754082631 想约:10.722584331418851 喝上:10.722584331418851 就可以:10.525380377809771 煮:10.525380377809771 约:7.16703787691222 电饭煲:11.434055402812444 的:2.1972245773362196 就:14.550344638905543 好:13.328818040700815 后:8.37930948405285 自动:12.108878692538742 今天:5.780743515792329 油条:9.54136924893133 饭:11.166992617563398 豆浆机:4.1588830833596715 一小时:10.927663610051221 几小时:13.130529940070723 自然:13.130529940070723 还:8.580918882296782 让:7.824046010856292 了:13.183347464017316 起床:9.436997742590188
3823890210294392 约:3.58351893845611 我:3.8918202981106265 豆浆:4.394449154672439 今天:5.780743515792329 了:4.394449154672439 油条:9.54136924893133
3823890235477306 一会儿:15.327754517406941 去:5.991464547107982 儿子:9.911654115202522 约:3.58351893845611 动物园:12.553286978683289 带:9.54136924893133 起:9.043577154098081
3823890239358658 继续:11.166992617563398 支持:7.522400231387125
3823890256464940 次:13.130529940070723 起来:7.052721049232323 约:3.58351893845611 饭:11.166992617563398 去:5.991464547107982
3823890264861035 约:3.58351893845611 我:3.8918202981106265 了:4.394449154672439 吃饭:9.326878188224134 哦:7.221835825288449
3823890281649563 和家人:11.166992617563398 一起:6.089044875446846 吃个:12.108878692538742 相约:8.788898309344878 饭:11.166992617563398
3823890285529671 了:4.394449154672439 今天:5.780743515792329 广场:12.553286978683289 滑旱冰:15.327754517406941 一起:6.089044875446846 约:3.58351893845611
3823890294242412 九阳:2.1972245773362196 我:3.8918202981106265 全球:12.553286978683289 早餐:6.516193076042964 双:5.780743515792329 你:6.591673732008658 一起:6.089044875446846 首发:6.516193076042964 预约:5.545177444479562 啦:6.8679744089702925 即将:11.434055402812444 吃:6.8679744089702925 要约:10.187500401613525 豆浆机:4.1588830833596715
3823890314914825 一起:6.089044875446846 约:3.58351893845611 去:5.991464547107982 逛街:10.047761041692553 姐妹:11.744235578950832 今天:5.780743515792329 天气晴好:13.94146015628705 起:9.043577154098081 们:7.700295203420117
3823890323625419 邮:11.166992617563398 全国:12.108878692538742 jyl-:15.327754517406941 包:9.54136924893133 joyoung:9.656627474604603 九阳:2.1972245773362196
3823890335901756 的:2.1972245773362196 今年:12.553286978683289 暖和:12.553286978683289 果断:15.327754517406941 出来:11.434055402812444 逛街:10.047761041692553 一天:9.780698256443507 最:8.37930948405285 今天是:10.722584331418851
3823890364788305 出:11.166992617563398 来了:8.15507488781144 去去:13.94146015628705 去:5.991464547107982 好友:12.108878692538742 赏花:11.744235578950832 踏青:9.780698256443507 约:3.58351893845611 一起:6.089044875446846 春天:7.16703787691222
3823890369489295 让:7.824046010856292 练:26.261059880141445 下载:13.130529940070723 九阳:2.1972245773362196 吧:6.664409020350408 我:3.8918202981106265 九阴真经:13.94146015628705 免费:12.553286978683289 挂:15.327754517406941 了吧:15.327754517406941 平湖:15.327754517406941 走火入魔:11.434055402812444 真经:10.927663610051221 小子:15.327754517406941 开:10.525380377809771 你:6.591673732008658 三叉神经:15.327754517406941 在:6.802394763324311 毁了:15.327754517406941 改:15.327754517406941
3823890373686361 一起:6.089044875446846 约:3.58351893845611 理发:12.553286978683289 了:4.394449154672439 小伙伴:9.436997742590188 去:5.991464547107982
3823890378201539 吃:6.8679744089702925 得很:13.130529940070723 啊:8.1886891244442 今天:5.780743515792329 姐妹:11.744235578950832 开心:8.788898309344878 去:5.991464547107982 玩:8.439015410352214 周末:8.317766166719343 逛街:10.047761041692553 了:4.394449154672439 约:3.58351893845611 美食:8.954673628956414
hadoop2.5.2学习13-MR之新浪微博-DF的实现相关推荐
- ThinkPhp学习13
原文:ThinkPhp学习13 简单登录验证 创建Login类 1 <?php 2 class LoginAction extends Action { 3 function index(){ ...
- JavaScript学习13 JavaScript中的继承
JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript">//继承第一种方式: ...
- 动手深度学习13——计算机视觉:数据增广、图片分类
文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...
- Oracle PL/SQL基础语法学习13:比较运算符
系列文章目录 Oracle PL/SQL基础语法学习12:短路求值 Oracle PL/SQL基础语法学习13:比较运算符 Oracle PL/SQL基础语法学习14:BOOLEAN表达式 文章目录 ...
- hadoop2.5.2学习14--MR之协同过滤天猫推荐
本文根据天猫推荐学习系统过滤算法 电子商务网站是个性化推荐系统重要地应用的领域之一,亚马逊就是个性化推荐系统的积极应用者和推广者,亚马逊的推荐系统深入到网站的各类商品,为亚马逊带来了至少30%的销 ...
- 一文盘点深度学习13个常见问题(附详细解答amp;学习资源)
作者:VIDHYA小组 翻译:陈之炎 校对:顾佳妮 本文共4700字,建议阅读10+分钟. 本文为你解答关于入门深度学习的问题,并列出了大量的资源让你起步学习. 概述 从Facebook的研究到Dee ...
- Hadoop-2.2.0学习之二HDFS联盟
在学习Hadoop-2.x版本中的HDFS之前先看一下目前普遍使用中的Hadoop-1.x版本的HDFS结构,有助于更好地理解2.x版本中HDFS的变化所带来的好处.先看看2.x版本之前的HDFS结构 ...
- int arr 13 java,java学习13 - 数组的定义、操作、异常、二维数组
续java学习12: 1.数组,引用类型变量,保存数据实际是保存的数组的首地址 2.定义数组容器三要素,数据类型,大小(长度),数组名 3.数组的定义公式一:数据类型[] 数组名 = new 数据类型 ...
- 动手深度学习13:计算机视觉——语义分割、风格迁移
文章目录 一.语义分割 1.1 语义分割简介 1.2 Pascal VOC2012 语义分割数据集 1.2.1下载.读取数据集 1.2.2 构建字典(RGB颜色值和类名互相映射) 1.2.3 数据预处 ...
最新文章
- 《Adobe InDesign CS6中文版经典教程》—第2课2.1节概述
- 蜜糖变砒霜:90%美国公司区块链项目将不再重启
- Jenkins与SVN持续集成
- python中如何将字符串连接在一起,多倍的字符串如何输出
- Name Server Daemon (NSD)
- 22岁印度大学生获谷歌天价offer,击败6000人年薪百万
- rsync(一):基本命令和用法
- emwin读取sd图片_手机内存不够用?这样清理垃圾文件和巧用SD卡扩容硬件存储空间...
- 修改JBoss-7.1.1 http访问端口并取消JBoss内网访问限制
- Spark源码分析之Spark Shell(下)
- 1024程序员 | 我如何从零基础转行成为一个自信的前端
- 浅谈管理软件的功能与作用-—以Nvisual综合布线可视化运维管理平台和进销存管理软件为例
- 拼多多数据分析工具有哪些?拼多多数据分析工具介绍
- 经典面试问题回答思路
- rtl驱动 ubuntu 禁用_Ubuntu下成功安装台式机网卡realtek的rtl8188eu芯片驱动并实现AP功能...
- 手机系统软件测试员,手机软件测试员做啥的?行业分析
- 用Threejs做一只会动的3D玉兔祝大家中秋快乐
- Keystore was tampered with, or password was incorr
- 如何防御黑客的社工?
- 开始绘制立体图形立方体正四面体
热门文章
- 学习 Gitee+Hexo 搭建个人博客这一篇就够了
- win32编程改变空间的背景颜色
- linux管理员默认名,administrator怎么改名字?administrator默认密码是多少
- java 浪漫_程序员的浪漫:用 java 实现每天给对象法发情话
- 信联征信参与新国都首届国际代理商大会
- sphinx mysql php使用_Sphinx全文检索之PHP使用教程
- 数极客发布V3.3版本,首家拥有15种用户行为数据分析模型
- google谷歌最*的十大时刻漏了什么?
- 浏览器缓存网页清理方法
- 使用python判断字母大小写的几种方法