mapreduce二次排序案例

2023-05-16

为什么需要二次排序?

在MapReduce操作时,我们知道传递的<key,value>会按照key的大小进行排序,最后输出的结果是按照key排过序的。有的时候我们在key排序的基础上,对value也进行排序。这种需求就是二次排序:


解决思路:

我们可以把key和value联合起来作为新的key,记作newkey。这时,newkey含有两个字段,假设分别是k,v。这里的k和v是原来的key和value。原来的value还是不变。这样,value就同时在newkey和value的位置。我们再实现newkey的比较规则,先按照key排序,在key相同的基础上再按照value排序。在分组时,再按照原来的key进行分组,就不会影响原有的分组逻辑了。最后在输出的时候,只把原有的key、value输出,就可以变通的实现了二次排序的需求.





二次排序的步骤

案例源码资料:http://pan.baidu.com/s/1i523w8H

1 自定义key。 

mr中的分区和分组都和key相关,所有的key是需要被比较和排序的,需要二次排序时,先根据key中的第一个属性进行比较排序,第一个属性相同时,在第一个属性相同的情况下,再进行下一个的比较和排序;(程序员必知的8大排序:http://blog.csdn.net/qq_39532946/article/details/76228075)
所有自定义的key应该实现接口WritableComparable,因为是可序列的并且可比较的。并重载方法 

2自定义分区类(继承Partitionner).

2.1 自定义分区函数类继承Partitioner。(第一次比较)。 


public static class FirstPartitioner extends Partitioner<IntPair,IntWritable> 

在job中设置使用setPartitionerClasss 

2.2 key比较函数类需要继承WritableComparator(第二次比较)

public class PairWritable implements WritableComparable<PairWritable>{

    private String name;//要比较的第一个字段,姓名

    private float  money; //要比较的第二个字段,消费金额 

 

    // shuffle过程中的排序就是根据此处的比较规则

    public int compareTo(PairWritable o){

        //先比较二者的name

        int comp =this.name.compareTo(o.name);

        if(0!= comp){

            return  comp;

        }

        //在第一个字段name一样的情况下比较money,基本数据类型是没有compareTo,需要装箱成包装类

        //return(Float.valueOf(this.money)).compareTo(Float.valueOf(o.money));

        return Float.valueOf(o.money).compareTo(Float.valueOf(this.money));

    }

   

}

 


public static class KeyComparator extends WritableComparator 
必须有一个构造函数,并且重载 public int compare(WritableComparable w1, WritableComparable w2) 
另一种方法是 实现接口RawComparator。 
在job中设置使用setSortComparatorClass。 

3自定义分组函数类,需要继承WritableComparator。 
public static class GroupingComparator extends WritableComparator 
必须有一个构造函数,并且重载 public int compare(WritableComparable w1, WritableComparable w2) 
分组函数类另一种方法是实现接口RawComparator。 
在job中设置使用setGroupingComparatorClass。 



另外注意的是,如果reduce的输入与输出不是同一种类型,则不要定义Combiner也使用reduce,因为Combiner的输出是reduce的输入。除非重新定义一个Combiner。 



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mapreduce二次排序案例 的相关文章

  • 如何用hadoop实现自连接/叉积?

    对成对的项目进行评估是常见的任务 示例 重复数据删除 协同过滤 相似项目等 这基本上是具有相同数据源的自连接或叉积 要进行自连接 您可以遵循 减少端连接 模式 映射器将连接 外键作为键发出 将记录作为值发出 因此 假设我们想要对以下数据的
  • 流数据和 Hadoop? (不是 Hadoop 流)

    我想使用 MapReduce 方法分析连续的数据流 通过 HTTP 访问 因此我一直在研究 Apache Hadoop 不幸的是 Hadoop 似乎希望以固定大小的输入文件开始作业 而不是在新数据到达时将其传递给消费者 事实确实如此 还是我
  • Hadoop MapReduce 提供嵌套目录作为作业输入

    我正在从事一项处理嵌套目录结构的工作 其中包含多个级别的文件 one three four baz txt bleh txt foo txt two bar txt gaa txt 当我添加one 作为输入路径 不会处理任何文件 因为没有文
  • 仅使用一个映射器的 Hadoop gzip 输入文件[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 hadoop 不能分割一个大文本文件 然后使用 gzip 压缩分割的内容 https stackoverflow com questions 6511255 why cant hadoop s
  • mrjob组合器不工作python

    简单的映射组合reduce程序 映射column 1与值column 3并追加 在相同键和附加的每个映射器输出中 减少相同密钥的输出后 input 1 and input 2两个文件都包含 a 1 2 3 a 4 5 6 Code is f
  • 使用 MultipleOutputs 写入 MapReduce 中的 HBase

    我目前有一个 MapReduce 作业 它使用 MultipleOutputs 将数据发送到多个 HDFS 位置 完成后 我使用 HBase 客户端调用 在 MR 之外 将一些相同的元素添加到一些 HBase 表中 使用 TableOutp
  • 两个相等的组合键不会到达同一个减速器

    我正在使用 MapReduce 框架用 Java 制作 Hadoop 应用程序 我仅使用文本键和值进行输入和输出 在减少最终输出之前 我使用组合器进行额外的计算步骤 但我有一个问题 钥匙没有进入同一个减速器 我在组合器中创建并添加键 值对
  • 如何读取 RCFile

    我正在尝试将一个小的 RCFile 约 200 行数据 读入 HashMap 中以进行 Map Side 连接 但是在将文件中的数据变为可用状态时遇到了很多麻烦 这是我到目前为止所拥有的 其中大部分来自这个例子 http sumit1001
  • hadoop map reduce 中的错误处理

    根据文档 有几种方法可以在 MapReduce 中执行错误处理 以下是一些 A 使用枚举的自定义计数器 每个失败记录的增量 b 记录错误并稍后分析 计数器给出失败记录的数量 然而 为了获取失败记录的标识符 可能是其唯一键 以及发生异常的详细
  • MapReduce 排序和洗牌如何工作?

    我正在使用 yelps MRJob 库来实现映射缩减功能 我知道 MapReduce 有一个内部排序和洗牌算法 它根据键对值进行排序 所以如果我在地图阶段后得到以下结果 1 24 4 25 3 26 我知道排序和洗牌阶段将产生以下输出 1
  • java.lang.IllegalArgumentException:错误的 FS:,预期:hdfs://localhost:9000

    我正在尝试实现reduce side join 并使用mapfile reader来查找分布式缓存 但在stderr中检查时它没有查找值 它显示以下错误 lookupfile文件已经存在于hdfs中 并且似乎已正确加载进入缓存 如标准输出中
  • MongoDB:在没有并行性的情况下使用 MapReduce 有什么意义?

    Quoting http www mongodb org display DOCS MapReduce MapReduce Parallelism http www mongodb org display DOCS MapReduce Ma
  • 使用 Hadoop 映射两个数据集

    假设我有两个键值数据集 数据集A和B 我们称它们为数据集A和B 我想用 B 组的数据更新 A 组中的所有数据 其中两者在键上匹配 因为我要处理如此大量的数据 所以我使用 Hadoop 进行 MapReduce 我担心的是 为了在 A 和 B
  • RavenDB:为什么我会在此多重映射/归约索引中获得字段空值?

    受到 Ayende 文章的启发https ayende com blog 89089 ravendb multi maps reduce indexes https ayende com blog 89089 ravendb multi m
  • 适用于 Hadoop 的 DynamoDB 输入格式

    我必须使用 Hadoop mapreduce 处理保留在 Amazon Dynamodb 中的一些数据 我在互联网上搜索 Dynamo DB 的 Hadoop InputFormat 但找不到它 我对 Dynamo DB 不熟悉 所以我猜测
  • Java8:使用 Stream / Map-Reduce / Collector 将 HashMap 转换为 HashMap

    我知道如何 改造 一个简单的JavaList from Y gt Z i e List
  • MongoDB 存储过程等效项

    我有一个包含商店列表的大型 CSV 文件 其中一个字段是邮政编码 我有一个名为 ZipCodes 的独立 MongoDB 数据库 它存储任何给定邮政编码的纬度和经度 在 SQL Server 中 我将执行一个名为 InsertStore 的
  • 在 RavenDB 中创建更多类似的内容

    我的域中有这些文档 public class Article public string Id get set some other properties public IList
  • 是否可以通过编写单独的mapreduce程序并行执行Hive查询?

    我问了一些关于提高 Hive 查询性能的问题 一些答案与映射器和减速器的数量有关 我尝试使用多个映射器和减速器 但在执行中没有看到任何差异 不知道为什么 可能是我没有以正确的方式做 或者我错过了其他东西 我想知道是否可以并行执行 Hive
  • 为什么 Spark 没有使用本地计算机上的所有核心

    当我在 Spark Shell 中或作为作业运行一些 Apache Spark 示例时 我无法在单台计算机上实现完全的核心利用率 例如 var textColumn sc textFile home someuser largefile t

随机推荐

  • OBS推流工具使用说明

    一 软件介绍 1 1 什么是OBS Open Broadcaster Software xff08 简称OBS xff09 是目前市面上最好用的直播软件 xff0c 支持 OS X Windows Linux操作系统 xff0c 适用于多种
  • 一文全解经典机器学习算法之支持向量机SVM(关键词:SVM,对偶、间隔、支持向量、核函数、特征空间、分类)

    文章目录 一 xff1a 概述二 xff1a 间隔与支持向量三 xff1a 对偶问题 xff08 1 xff09 什么是对偶问题 xff08 2 xff09 SVM对偶问题 xff08 3 xff09 SMO算法 四 xff1a 核函数 x
  • 【数据聚类|深度聚类】Nearest Neighbor Matching for Deep Clustering(NNM)论文研读

    文章目录 Abstract Intorduction Related work Deep Clustering Contrastive Representation Learning Methodology Unsupervised Rep
  • (数字图像处理MATLAB+Python)第六章图像平滑-第一节:图像平滑概述和空间域平滑滤波

    文章目录 一 xff1a 图像中的噪声 xff08 1 xff09 图像噪声分类 xff08 2 xff09 图像噪声的数学模型 xff08 3 xff09 程序 二 xff1a 空间域平滑滤波 xff08 1 xff09 均值滤波A xf
  • 二进制里的青春与爱

    我要挥舞着笔墨 xff0c 把人生写得淋漓尽致 xff1b 我要敲击着键盘 xff0c 把世界编得明明白白 xff01 我的青春在指尖流逝 xff0c 我的爱在黑白屏前显现 题记 时间匆匆 xff0c 岁月如流 时间的推手催促着我匆忙赶路
  • 使用 Java 实现快速排序(详解)

    一 概述 最近在看一些面试题 xff0c 发现很多面试过程中都会要求手写快速排序 xff0c 查阅一些博客发现别人写的并不是特别清楚而且也很难记住 xff0c 所以为了更好的掌握这个算法 xff0c 所以在这篇文章中 xff0c 将自己的学
  • CentOS7搭建Samba共享文件夹 设置无密码登录

    搭建之前 xff1a 关闭防火墙 CentOS7默认的防火墙不是iptables xff0c 而是firewalle 停止firewalld服务 systemctl stop firewalld 禁用firewalld服务 systemct
  • 查看 openstack 组件日志

    openstack 部署方式 kolla ansible 使用 kolla ansible 部署方式时 xff0c 所有组件的日志文件会外挂到宿主机上 xff08 都是使用容器启动的 xff09 xff0c 可以在相应节点的 var log
  • 15th 【最短路 dijkstra】最小花费

    最小花费 在n个人中 xff0c 某些人的银行账号之间可以互相转账 这些人之间转账的手续费各不相同 给定这些人之间转账时需要从转账金额里扣除百分之几的手续费 xff0c 请问A最少需要多少钱使得转账后B收到100元 输入文件 第一行输入两个
  • 使用VNC远程登录百度智能云服务器

    使用VNC服务远程登录对浏览器有一定的要求 xff0c 现在只支持如下版本的浏览器 xff0c 使用之前注意VNC页面的提示 浏览器名称版本Google Chrome16 43 Firefox3 6 43 iOS Safari6 1 43
  • Linux环境下为普通用户添加sudo权限

    系统环境 xff1a Centos6 5 1 背景 xff1a sudo是Linux系统管理指令 xff0c 是允许系统管理员让普通用户执行一些或者全部root命令的一个工具 Linux系统下 xff0c 为了安全 xff0c 一般来说我们
  • 利用jquery实现当前时间动态显示

    html代码 xff1a lt div id 61 34 time 34 gt lt div gt jQuery代码 lt script type 61 34 text javascript 34 gt setInterval functi
  • Turtlebot3 Gazebo仿真环境下深度强化学习DQN开发环境构建

    1 Anaconda2 安装 2 Tensorflow安装 ubuntu18系统anaconda安装tensorflow qq 39429669的博客 CSDN博客 3 下载并编译源码 本文先使用github中开源的机器学习的源码进行学习
  • Python数据挖掘 - 第一部分

    文章目录 第一章 数据挖掘库的安装第二章 Matplotlib2 1 matplotlib简介2 2 折线图 xff08 plot xff09 与基础绘图功能2 3 散点图 xff08 scatter xff09 2 4 柱状图 xff08
  • TortoiseGit解决冲突

    TortoiseGit解决冲突 问题概述场景重现解决冲突 问题概述 在项目实施过程中 xff0c 多人维护同一份文件或代码时经常会在本地Commit完再从远程仓库Pull时出现冲突 这时需要保留自己的内容 xff0c 同时也保留远程仓库原来
  • axios的简单封装

    前言 在每次使用原装的axios发送 http请求时 如果需要token验证 xff0c 则都需要创建拦截器 xff0c 添加 39 token 39 请求头 xff0c 或者在config中具体的请求体中添加 xff0c 是一个非常麻烦的
  • 【操作系统】RT-Thread 入门学习

    一 嵌入式操作系统 1 1 软实时与硬实时 强实时操作系统 xff1a 严格限定在规定时间内完成任务 xff0c 否则就会导致灾难性的发生 xff0c 例如导弹拦截系统 汽车引擎系统等 弱实时操作系统 xff1a 可以允许偶尔出现一定的时间
  • windows10安装NVIDIA显卡驱动+cuda10.0教程

    windows10安装NVIDIA显卡驱动 43 cuda10 0教程 1 安装个鲁大师2 确定本机是否支持GPU加速3 更换至匹配的显卡驱动4 下载和安装cuda和cudnn5 验证6 游戏加速7 分享个漂亮的壁纸 1 安装个鲁大师 查看
  • 生成小批量数据集

    shell脚本随机筛选一个目录下后缀为2 4 6 8的 mp4文件 span class token function find span mnt sdb dataset 20181217 RX5 zheA5MV46 name mp4 sp
  • mapreduce二次排序案例

    为什么需要二次排序 在MapReduce操作时 xff0c 我们知道传递的 lt key value gt 会按照key的大小进行排序 xff0c 最后输出的结果是按照key排过序的 有的时候我们在key排序的基础上 xff0c 对valu