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

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

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

相关文章

液压支架销轴力学计算分析研究_基于RFID射频精准定位的智能开采研究与应用...

一、项目背景近年来随着智能开采技术的不断发展&#xff0c;装备和新工艺不断更新换代,在智能开采中&#xff0c;对采煤机位置的精准定位是能否实现智能开采的关键&#xff0c;只有准确无误地获取煤机的准确位置&#xff0c;才能实现工作面的智能化开采&#xff0c;进而提高生产…

您是否能及时编译?

还记得上次被C开发人员嘲笑的时候吗&#xff1f; Java如此繁琐&#xff0c;以至于他们甚至都不会考虑使用这种语言&#xff1f; 在许多方面&#xff0c;这一概念仍然成立。 但是对于典型的用法&#xff08;在大型企业的骨干中&#xff09;&#xff0c;Java性能绝对可以与许多竞…

2d物理引擎01

我一直想做一个游戏&#xff0c;但一直感觉自己水平不够 想了想觉得不去做的话就永远做不出来 所以有了这个博文 01 我需要一个东西来显示&#xff0c;很显然h5中canvas是很好的选择 <!DOCTYPE html> <html><head><meta charset"utf-8" />&l…

Liferay Model Hints

这篇文章主要介绍如何通过model hint 来修改liferay builder service生成数据库表中默认字段的长度。 1.什么是Model Hints? 它是对liferay builder service生成的model类的基本提示. 2. 它在什么地方被定义的&#xff1f; portlet-model-hints.xml 3. 文件位置&#xff1f; /…

浏览器书签备份管理

1、火狐浏览器备份导出HTML文件&#xff1a; CtrlJ 书签 - 导入/导出 2、谷歌浏览器&#xff1a; 设置中 导入书签 转载于:https://www.cnblogs.com/AmbiguousMiao/p/8084721.html

选择您的收藏库

这真的是您应该烦恼的吗&#xff1f; java.util.ArrayList和java.util.HashMap从根本上有问题吗&#xff1f; 对于大多数源代码&#xff0c;答案是–不&#xff1b; 这些实现完全可以。 但是&#xff0c;一如既往&#xff0c;细节决定成败。 并存在情况下&#xff0c;当是内置…

里公式后面标号怎么对齐_你若会用Word里F4键,又何须加班到半夜?

F4键在Word里面表示重复上一个操作&#xff0c;但对于这个快捷键&#xff0c;你真的会操作吗&#xff1f;本期与大家分享这个神奇的F4键&#xff0c;助你高效工作。1、批量复制文本在一般情况下&#xff0c;我们是用CtrlC复制内容&#xff0c;CtrlV粘贴内容&#xff0c;但遇到特…

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC&#xff0c;同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&am…

数据导出

数据导出和数据导入刚好是相反的&#xff0c;把逻辑反过来就可以了。 源码&#xff1a;https://github.com/SeaLee02/FunctionModule/blob/master/UploadFiles/WebDemo/COM/DataToOut.aspx 效果&#xff1a; 然后勾选需要导出的数据&#xff0c;生成Excel 部分前台&#xff1a;…

spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战

一、事务传播性1.1 什么是事务的传播性事务的传播性一般在事务嵌套时候使用&#xff0c;比如在事务A里面调用了另外一个使用事务的方法&#xff0c;那么这俩个事务是各自作为独立的事务执行提交&#xff0c;还是内层的事务合并到外层的事务一块提交那&#xff0c;这就是事务传播…

前端为什么非要动静分离 说一下CDN托管的意义

大型Web应用对速度的追求并没有止步于仅仅利用浏览器缓存&#xff0c;因为浏览器缓存始终只是为了提升二次访问的速度&#xff0c;对于首次访问的加速&#xff0c;我们需要从网络层面进行优化&#xff0c;最常见的手段就是CDN&#xff08;Content Delivery Network&#xff0c;…

CSS position(定位)属性

关于CSS position&#xff0c;来自MDN的描述&#xff1a; CSS position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left 属性则决定了该元素的最终位置。 然后来看看什么是文档流(normal flow)&#xff0c;下面是 www.w3.org 的描述&#xff1a; Normal flo…

Java ByteBuffer –速成课程

以我的经验&#xff0c;当开发人员第一次遇到java.nio.ByteBuffer时&#xff0c;会引起混乱和细微的错误&#xff0c;因为如何正确使用它尚不明显。 在我对API文档感到满意之前&#xff0c;需要反复阅读API文档和一些经验以实现一些微妙之处。 这篇文章是关于如何正确使用它们的…

实现编辑功能有哪几个action_Web 应用的撤销重做实现

背景前不久&#xff0c;我参与开发了团队中的一个 web 应用&#xff0c;其中的一个页面操作如下图所示&#xff1a;GIF这个制作间页面有着类似 PPT 的交互&#xff1a;从左侧的工具栏中选择元素放入中间的画布、在画布中可以删除、操作&#xff08;拖动、缩放、旋转等&#xff…

windows下如何安装pip以及如何查看pip是否已经安装成功?

最近刚学习python&#xff0c;发现很多关于安装以及查看pip是否安装成的例子都比较老&#xff0c;不太适合于现在&#xff08;python 3.6 &#xff09;因此&#xff0c;下一个入门级别的教程。 0&#xff1a;首先如何安装python我就不做介绍了。 1&#xff1a;如果安装的是pyth…

检查用户显示器的分辨率

检查用户显示器的分辨率 转载于:https://www.cnblogs.com/Renyi-Fan/p/8088012.html

android 字体 dpi,详解Android开发中常用的 DPI / DP / SP

Android的碎片化已经被喷了好多年&#xff0c;随着国内手机厂商的崛起&#xff0c;碎片化也越来越严重&#xff0c;根据OpenSignal的最新调查&#xff0c;2014年市面上有18796种不同的Android设备&#xff0c;作为开发者&#xff0c;一个无法回避的难题就是需要适配各种各样奇奇…

android studio闪退代码不报错_代码不报错,不代表真的没错

今天是生信星球陪你的第695天大神一句话&#xff0c;菜鸟跑半年。我不是大神&#xff0c;但我可以缩短你走弯路的半年~就像歌儿唱的那样&#xff0c;如果你不知道该往哪儿走&#xff0c;就留在这学点生信好不好~这里有豆豆和花花的学习历程&#xff0c;从新手到进阶&#xff0c…

Centos7操作系统部署指南

一、硬件环境&#xff1a; Dell R620 二、软件环境&#xff1a; Centos6.4 X86_64 KVM Windows7vnc 三、安装说明 操作系统更新之迅速&#xff0c;让作为新手的系统运维人员有点措手不及&#xff0c;相对于老手就胸有成竹。怎么讲&#xff1f;由于老手对技术方向把握的非常好&…

Eclipse插件中的SLF4J登录

一直都在使用Maven和纯Java库进行开发&#xff0c;我从没想过在开发Eclipse插件时发出一些日志语句可能会成为问题。 但是&#xff0c;在Eclipse开发人员的想象中&#xff0c;一切似乎总是在Eclipse环境中&#xff0c;而Eclipse宇宙之外则什么都没有。 如果您使用Google搜索上…