本文接上篇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的实现相关推荐

  1. ThinkPhp学习13

    原文:ThinkPhp学习13 简单登录验证 创建Login类 1 <?php 2 class LoginAction extends Action { 3 function index(){ ...

  2. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript">//继承第一种方式: ...

  3. 动手深度学习13——计算机视觉:数据增广、图片分类

    文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...

  4. Oracle PL/SQL基础语法学习13:比较运算符

    系列文章目录 Oracle PL/SQL基础语法学习12:短路求值 Oracle PL/SQL基础语法学习13:比较运算符 Oracle PL/SQL基础语法学习14:BOOLEAN表达式 文章目录 ...

  5. hadoop2.5.2学习14--MR之协同过滤天猫推荐

    本文根据天猫推荐学习系统过滤算法   电子商务网站是个性化推荐系统重要地应用的领域之一,亚马逊就是个性化推荐系统的积极应用者和推广者,亚马逊的推荐系统深入到网站的各类商品,为亚马逊带来了至少30%的销 ...

  6. 一文盘点深度学习13个常见问题(附详细解答amp;学习资源)

    作者:VIDHYA小组 翻译:陈之炎 校对:顾佳妮 本文共4700字,建议阅读10+分钟. 本文为你解答关于入门深度学习的问题,并列出了大量的资源让你起步学习. 概述 从Facebook的研究到Dee ...

  7. Hadoop-2.2.0学习之二HDFS联盟

    在学习Hadoop-2.x版本中的HDFS之前先看一下目前普遍使用中的Hadoop-1.x版本的HDFS结构,有助于更好地理解2.x版本中HDFS的变化所带来的好处.先看看2.x版本之前的HDFS结构 ...

  8. int arr 13 java,java学习13 - 数组的定义、操作、异常、二维数组

    续java学习12: 1.数组,引用类型变量,保存数据实际是保存的数组的首地址 2.定义数组容器三要素,数据类型,大小(长度),数组名 3.数组的定义公式一:数据类型[] 数组名 = new 数据类型 ...

  9. 动手深度学习13:计算机视觉——语义分割、风格迁移

    文章目录 一.语义分割 1.1 语义分割简介 1.2 Pascal VOC2012 语义分割数据集 1.2.1下载.读取数据集 1.2.2 构建字典(RGB颜色值和类名互相映射) 1.2.3 数据预处 ...

最新文章

  1. 《Adobe InDesign CS6中文版经典教程》—第2课2.1节概述
  2. 蜜糖变砒霜:90%美国公司区块链项目将不再重启
  3. Jenkins与SVN持续集成
  4. python中如何将字符串连接在一起,多倍的字符串如何输出
  5. Name Server Daemon (NSD)
  6. 22岁印度大学生获谷歌天价offer,击败6000人年薪百万
  7. rsync(一):基本命令和用法
  8. emwin读取sd图片_手机内存不够用?这样清理垃圾文件和巧用SD卡扩容硬件存储空间...
  9. 修改JBoss-7.1.1 http访问端口并取消JBoss内网访问限制
  10. Spark源码分析之Spark Shell(下)
  11. 1024程序员 | 我如何从零基础转行成为一个自信的前端
  12. 浅谈管理软件的功能与作用-—以Nvisual综合布线可视化运维管理平台和进销存管理软件为例
  13. 拼多多数据分析工具有哪些?拼多多数据分析工具介绍
  14. 经典面试问题回答思路
  15. rtl驱动 ubuntu 禁用_Ubuntu下成功安装台式机网卡realtek的rtl8188eu芯片驱动并实现AP功能...
  16. 手机系统软件测试员,手机软件测试员做啥的?行业分析
  17. 用Threejs做一只会动的3D玉兔祝大家中秋快乐
  18. Keystore was tampered with, or password was incorr
  19. 如何防御黑客的社工?
  20. 开始绘制立体图形立方体正四面体

热门文章

  1. 学习 Gitee+Hexo 搭建个人博客这一篇就够了
  2. win32编程改变空间的背景颜色
  3. linux管理员默认名,administrator怎么改名字?administrator默认密码是多少
  4. java 浪漫_程序员的浪漫:用 java 实现每天给对象法发情话
  5. 信联征信参与新国都首届国际代理商大会
  6. sphinx mysql php使用_Sphinx全文检索之PHP使用教程
  7. 数极客发布V3.3版本,首家拥有15种用户行为数据分析模型
  8. google谷歌最*的十大时刻漏了什么?
  9. 浏览器缓存网页清理方法
  10. 使用python判断字母大小写的几种方法