mapreduce 算法

这篇文章是介绍MapReduce算法的系列文章的另一部分,该书在使用MapReduce进行数据密集型文本处理中找到。 先前的文章是Local Aggregation , Local Aggregation PartII和创建共现矩阵 。 这次我们将讨论阶数反转模式。 顺序反转模式利用的MapReduce来计算所需要的提前将被操纵的数据减速推送数据的排序阶段..你关闭此作为MapReduce的边缘状态之前,我强烈推荐您阅读作为我们将讨论如何利用排序的优势,并使用自定义分区程序进行覆盖,这两个实用程序都是有用的工具。

尽管许多MapReduce程序是用较高级别的抽象(即Hive或Pig)编写的,但了解较低级的情况仍然有帮助。顺序反转模式可在使用MapReduce进行数据密集型文本处理的第3章中找到。 。 为了说明顺序倒置模式,我们将从同现矩阵模式中使用Pairs方法。 创建同现矩阵时,我们会跟踪单词一起出现的总次数。 在较高的层次上,我们采用“成对”方法并稍加改动,除了使映射器发出诸如(“ foo”,“ bar”)之类的单词对外,我们还将发出(“ foo”,“ *”),并且将对每个单词对执行此操作,因此我们可以轻松得出最左单词出现频率的总计数,并使用该计数来计算我们的相对频率。 这种方法提出了两个具体问题。 首先,我们需要找到一种方法来确保单词对(“ foo”,“ *”)首先到达减速器。 其次,我们需要确保所有具有相同左单词的单词对都到达相同的缩减词。 在解决这些问题之前,让我们看一下我们的映射器代码。

映射器代码

首先,我们需要使用Pairs方法修改映射器。 在发出特定单词的所有单词对之后,在每个循环的底部,我们将发出特殊标记WordPair(“ word”,“ *”)以及在左侧找到单词的次数。

public class PairsRelativeOccurrenceMapper extends Mapper<LongWritable, Text, WordPair, IntWritable> {private WordPair wordPair = new WordPair();private IntWritable ONE = new IntWritable(1);private IntWritable totalCount = new IntWritable();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {int neighbors = context.getConfiguration().getInt('neighbors', 2);String[] tokens = value.toString().split('\\s+');if (tokens.length > 1) {for (int i = 0; i < tokens.length; i++) {tokens[i] = tokens[i].replaceAll('\\W+','');if(tokens[i].equals('')){continue;}wordPair.setWord(tokens[i]);int start = (i - neighbors < 0) ? 0 : i - neighbors;int end = (i + neighbors >= tokens.length) ? tokens.length - 1 : i + neighbors;for (int j = start; j <= end; j++) {if (j == i) continue;wordPair.setNeighbor(tokens[j].replaceAll('\\W',''));context.write(wordPair, ONE);}wordPair.setNeighbor('*');totalCount.set(end - start);context.write(wordPair, totalCount);}}}
}

现在,我们已经生成了一种跟踪遇到一个特定单词的总次数的方法,我们需要确保那些特殊字符首先到达化简器,以便可以计算出总数以计算相对频率。 通过修改WordPair对象上的compareTo方法,我们将在MapReduce流程的排序阶段为我们处理此问题。

修改后的排序

我们修改WordPair类上的compareTo方法,以便在右侧遇到“ *”字符时,将特定对象推到顶部。

@Overridepublic int compareTo(WordPair other) {int returnVal = this.word.compareTo(other.getWord());if(returnVal != 0){return returnVal;}if(this.neighbor.toString().equals('*')){return -1;}else if(other.getNeighbor().toString().equals('*')){return 1;}return this.neighbor.compareTo(other.getNeighbor());}

通过修改compareTo方法,我们现在可以确保将具有特殊字符的所有WordPair排在最前面,然后首先到达reducer。 这导致了我们的第二个专业化,我们如何保证具有给定左单词的所有WordPair对象都将被发送到相同的reducer? 答案是创建一个自定义分区程序。

自定义分区

通过计算键的哈希码对还原器的数量取模,将中间键改编为还原器。 但是我们的WordPair对象包含两个单词,因此采用整个对象的哈希码显然是行不通的。 我们需要修改一个自定义的分区程序,该分区程序在确定将哪个缩减程序发送到输出时仅考虑左边的单词。

public class WordPairPartitioner extends Partitioner<WordPair,IntWritable> {@Overridepublic int getPartition(WordPair wordPair, IntWritable intWritable, int numPartitions) {return wordPair.getWord().hashCode() % numPartitions;}
}

现在,我们保证将所有具有相同左单词的WordPair对象发送到相同的reducer。 剩下的就是构造一个化简器以利用发送数据的格式。

减速器

为倒序反转模式构建减速器很简单。 这将涉及保持计数器变量和“当前”字变量。 减速器将检查输入键WordPair中右侧的特殊字符“ *”。 如果左边的单词不等于“当前”单词,我们将重新设置计数器并求和所有值,以获得观察到给定当前单词的总次数。 现在,我们将处理下一个WordPair对象,对计数求和并除以我们的计数器变量,以获得相对频率。 该过程将继续进行,直到遇到另一个特殊字符并重新开始。

public class PairsRelativeOccurrenceReducer extends Reducer<WordPair, IntWritable, WordPair, DoubleWritable> {private DoubleWritable totalCount = new DoubleWritable();private DoubleWritable relativeCount = new DoubleWritable();private Text currentWord = new Text('NOT_SET');private Text flag = new Text('*');@Overrideprotected void reduce(WordPair key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {if (key.getNeighbor().equals(flag)) {if (key.getWord().equals(currentWord)) {totalCount.set(totalCount.get() + getTotalCount(values));} else {currentWord.set(key.getWord());totalCount.set(0);totalCount.set(getTotalCount(values));}} else {int count = getTotalCount(values);relativeCount.set((double) count / totalCount.get());context.write(key, relativeCount);}}private int getTotalCount(Iterable<IntWritable> values) {int count = 0;for (IntWritable value : values) {count += value.get();}return count;}
}

通过处理排序顺序并创建自定义分区程序,我们已经能够在计算所需的数据到达之前将数据发送到计算所需的化简器。 尽管此处未显示,但使用组合器来运行MapReduce作业。 这种方法也是“映射器内”合并模式的不错选择。

示例与结果

鉴于假期即将来临,我觉得现在是时候针对查尔斯·狄更斯(Charles Dickens)的小说《圣诞节颂歌》(A Christmas Carol)进行订单倒置模式的例子了。 我知道这很老套,但它能达到目的。

new-host-2:sbin bbejeck$ hdfs dfs -cat relative/part* | grep Humbug
{word=[Humbug] neighbor=[Scrooge]}    0.2222222222222222
{word=[Humbug] neighbor=[creation]}   0.1111111111111111
{word=[Humbug] neighbor=[own]}    0.1111111111111111
{word=[Humbug] neighbor=[said]}   0.2222222222222222
{word=[Humbug] neighbor=[say]}    0.1111111111111111
{word=[Humbug] neighbor=[to]} 0.1111111111111111
{word=[Humbug] neighbor=[with]}   0.1111111111111111
{word=[Scrooge] neighbor=[Humbug]}    0.0020833333333333333
{word=[creation] neighbor=[Humbug]}   0.1
{word=[own] neighbor=[Humbug]}    0.006097560975609756
{word=[said] neighbor=[Humbug]}   0.0026246719160104987
{word=[say] neighbor=[Humbug]}    0.010526315789473684
{word=[to] neighbor=[Humbug]} 3.97456279809221E-4
{word=[with] neighbor=[Humbug]}   9.372071227741331E-4

结论

虽然计算相对单词出现频率可能不是常见的任务,但我们已经能够演示排序和使用自定义分区程序的有用示例,这是构建MapReduce程序时可以使用的好工具。 如前所述,即使您的大多数MapReduce是像Hive或Pig那样以更高的抽象级别编写的,了解幕后的情况仍然很有帮助。 谢谢你的时间。

参考: MapReduce算法-来自JCG合作伙伴 Bill Bejeck的《 随机编码思考》博客中的顺序反转 。

翻译自: https://www.javacodegeeks.com/2012/12/mapreduce-algorithms-order-inversion.html

mapreduce 算法

mapreduce 算法_MapReduce算法–顺序反转相关推荐

  1. mapreduce排序算法_MapReduce算法–二级排序

    mapreduce排序算法 我们将继续执行有关实现MapReduce算法的系列文章,该系列可在使用MapReduce进行数据密集型文本处理中找到. 本系列的其他文章: 使用MapReduce进行数据密 ...

  2. mapreduce 算法_MapReduce算法–了解数据联接第二部分

    mapreduce 算法 自从我上一次发布以来已经有一段时间了,就像我上一次大休息一样,我正在Coursera上一些课程. 这次是Scala中的函数式编程 原理和React式编程原理 . 我发现它们都 ...

  3. mapreduce 算法_MapReduce算法–了解数据联接第1部分

    mapreduce 算法 在本文中,我们继续执行一系列实现算法的系列,该算法在使用MapReduce进行数据密集型文本处理中找到,这一次讨论数据联接. 虽然我们将讨论在Hadoop中联接数据的技术并提 ...

  4. MapReduce算法–顺序反转

    这篇文章是介绍MapReduce算法的系列文章的另一部分,该书在使用MapReduce进行数据密集型文本处理中找到. 先前的文章是Local Aggregation , Local Aggregati ...

  5. MapReduce 模式、算法和用例

    本文译自 Mapreduce Patterns, Algorithms, and Use Cases 在这篇文章里总结了几种网上或者论文中常见的MapReduce模式和算法,并系统化的解释了这些技术的 ...

  6. MapReduce改造fp-growth算法

    1. FP-Growth算法弊端 FP-Growth算法是挖掘频繁项集最常用的算法之一,其是基于迭代FP-Tree生成频繁项集的关联规则算法.此算法仅进行两次数据集扫描,递归迭代构建FP-Tree(F ...

  7. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

  8. 【MapReduce】使用MapReduce实现PageRank算法

    使用MapReduce实现PageRank算法 PageRank算法的介绍 PageRank是什么? 方法原理 算法过程 算法公式 算法的缺点 简单模型 代码的实现流程 数据信息 第一计数类 自定义类 ...

  9. 数据结构例1.已知顺序表L的长度为n,试编写算法实现在顺序表中删除值为elem的数据元素

    //已知顺序表L的长度为n,试编写算法实现在顺序表中删除值为elem的数据元素 //(其中n与elem从键盘输入) # include <iostream> # include <s ...

最新文章

  1. java链表list_java集合之linkedList链表基础
  2. boost::fibers模块实现异步调度的测试程序
  3. 15年3月c语言试卷,2015年3月二级C语言新增无纸化真题试卷(三)
  4. 硬件:如何选购适合自己的显示器
  5. 基克的聚合 机器人_重做秒变神器!基克的聚合成辅助标配
  6. 经验也有捷径,来看下这些热点、经验、技术等干货应有尽有的公众号吧!
  7. android layout_margin的值,Android自定义ViewGroup( 支持layout_margin属性)
  8. android pdf阅读开发
  9. 4600u黑苹果 r5_黑苹果集成显卡Intel HD Graphics 4400/4600 驱动方法
  10. 初中理化生实验室仪器配置
  11. 2022年第十三届蓝桥杯省赛B组python题目部分解题
  12. The Love Dare爱的挑战
  13. RISC-V嵌入式开发入门篇1:RISC-V GCC工具链的介绍
  14. Spring Boot + ECharts
  15. 【深度学习】(ICCV-2021)PVT-金字塔 Vision Transformer及PVT_V2
  16. 华为p20能更新鸿蒙么,华为Mate20+P20系列不再进行安全更新
  17. SpringBoot时区设置
  18. vue 实现Excel 导出
  19. 2月,写在转行7年之际
  20. [易飞]易飞ERP系统中,最低补量、补货位量、最小用量、领用倍量、批量之间分别代表什么意思,其中的公式计算逻辑是什么?

热门文章

  1. 漫画算法:辗转相除法是什么鬼
  2. 【LSB】图片隐写文档大纲
  3. 新的学期、新的开始、新的付出、新的收获!
  4. 比特(bit)和字节(byte)(1byte=8bit)
  5. python模板模式_python-模板方法模式
  6. java运行环境变量及自定义变量
  7. maven(6)仓库
  8. 在diy的文件系统上创建文件的流程
  9. HDU1576(欧几里得算法)
  10. RabbitMQ消息