在近期的Hadoop的学习中,在学习mapreduce时遇到问题:让求所给数据的top10,们我们指导mapreduce中是有默认的排列机制的,是按照key的升序从大到小排列的

然而top10问题的求解需要按照降序排列。在网上找了很长时间才得以解决,解决方法如下:

自定义一个比较器,这个比较器要继承WritableComparator类,代码如下:

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.WritableComparator; public class DescSort extends WritableComparator{ public DescSort() {
super(LongWritable.class,true);//注册排序组件
}
@Override
public int compare(byte[] arg0, int arg1, int arg2, byte[] arg3,
int arg4, int arg5) {
return -super.compare(arg0, arg1, arg2, arg3, arg4, arg5);//注意使用负号来完成降序
} @Override
public int compare(Object a, Object b) { return -super.compare(a, b);//注意使用负号来完成降序
}
}

在主函数中要执行时要声明该比较器的类的名称,代码如下:

package Sort;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.RawComparator;
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.output.FileOutputFormat;
public class SortRunner { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.252.200:9000");
Job job = Job.getInstance(conf);
job.setJarByClass(SortRunner.class); job.setSortComparatorClass(DescSort.class);
job.setMapperClass(SortMapper.class);
job.setReducerClass(SortReducer.class); job.setMapOutputKeyClass(LongWritable.class);
job.setMapOutputValueClass(NullWritable.class); job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(NullWritable.class); //输入输出的路径 FileInputFormat.setInputPaths(job,new Path("/sort/srcdata/"));
FileOutputFormat.setOutputPath(job, new Path("/sort/output3"));
System.exit(job.waitForCompletion(true)?0:1); }
}

注:红色部分便是声明比较器

这样就可以实现降序输出了。

网上与很多按照自定义类类型的排序的输出,在这里便不进行详细介绍,望采纳!!!!

mapreduce程序的按照key值从大到小降序排列的更多相关文章

  1. 转<<C#集合Dictionary中按值的降序排列

    转载地址:http://blog.sina.com.cn/s/blog_5c5bc9070100pped.html C#集合Dictionary中按值的降序排列 static void Main(st ...

  2. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  3. Java 将Map按Value值降序排列

    1 /** 2 * 将集合按照降序排列-FLOAT 3 * @param nowPartTwoData 4 * @return 5 */ 6 private static List<Map.En ...

  4. Activiti 删除key值相同的所有不同版本的流程定义

    package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...

  5. STL map 按key值和按value值排序

    map是用来存放<key, value>键值对的数据结构,能够非常方便高速的依据key查到对应的value. 假如存储水果和其单位价格.我们用map来进行存储就是个不错的选择. 我们这样定 ...

  6. 冒泡算法应用(坐标Y值降序X值升序)

    今天有个客户需求是有一坐标数组,希望按Y值降序X值升序排列,我临时写了个算法.先写个坐标类: class XYZ {     public XYZ() { }     public XYZ(doubl ...

  7. 怎么根据Comparable方法中的compareTo方法的返回值的正负 判断升序 还是 降序?

    public int compareTo(Student o) { return this.age - o.age; // 比较年龄(年龄的升序)    } 应该理解成return (-1)×(thi ...

  8. 大数据学习——mapreduce程序单词统计

    项目结构 pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  9. 大数据笔记(七)——Mapreduce程序的开发

    一.分析Mapreduce程序开发的流程 1.图示过程 输入:HDFS文件 /input/data.txt Mapper阶段:  K1:数据偏移量(以单词记)V1:行数据 K2:单词  V2:记一次数 ...

随机推荐

  1. 抓包之网络分析器- Wiresshark

    https://www.wireshark.org/ Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wi ...

  2. IC向管理者角色转换

    1. 虽然你认为自己已经想明白怎么干,但还是从怎么干回归到要解决的问题,抛给正确的人(应该对这些问题负责的人),引导他们想出问题的答案. 给别人机会和空间,帮助他们成长: 人们对自己“想”出的方案更有 ...

  3. 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)

    传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...

  4. Map的常用操作

    public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map. ...

  5. sql左外连接、右外连接、group by、distinct(区别)、intersect(交叉)、通配符、having

    连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行.             连接可分为以下几类 ...

  6. file.write(str),file.writelines(sequence)

    file.write(str)的参数是一个字符串,就是你要写入文件的内容.file.writelines(sequence)的参数是序列,比如列表,它会迭代帮你写入文件.

  7. C#-派生类

    VS派生类 继承.派生类 class AClass : FClass 构建函数继承 public classname (string astring): base(astring){};默认不继承基类 ...

  8. Docker搭建 MySQL 主从复制

    为什么选 Docker 搭建主从复制需要两个以上的MySQL, 使用 Docker 非常方便.如果以前没用过,找个简单的文档看看,熟悉一下命令. 搭建过程 1.下载镜像 docker pull mys ...

  9. Bad Day -- Daniel Powter

                                     Bad Day Bad Day (坏天气) 来自 Daniel Powter -- 2005年MTV欧洲音乐奖提名最佳新人, 出自专辑 ...

  10. (二)从分布式一致性谈到CAP理论、BASE理论

    问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ...