在hadoop中处理复杂业务时,需要用到复合键,复合不同于单纯的继承Writable接口,而是继承了 WritableComparable<T>接口,而实际上,WritableComparable<T>接口继承了 Writable和Comparable<T>接口,如果只需要使用某一个类作为传值对象而不是作为key,继承Writable接口即可。

上源码:

    public interface WritableComparable<T> extends Writable, Comparable<T> {
}
public interface Writable {  

  void write(DataOutput out) throws IOException;  

  void readFields(DataInput in) throws IOException;
}
    public interface Comparable<T> {  

        public int compareTo(T o);
}

以下是实现复合key的实例:

public class SortKey implements WritableComparable<SortKey>{  

    private Text name;
private IntWritable right; public SortKey() {
set(new Text(), new IntWritable());
} public SortKey(Text name, IntWritable right) {
set(name, right);
} private void set(Text name,IntWritable right){
this.name = name;
this.right = right;
} /**
* @return the name
*/
public Text getName() {
return name;
} /**
* @param name the name to set
*/
public void setName(Text name) {
this.name = name;
} /**
* @return the right
*/
public IntWritable getRight() {
return right;
} /**
* @param right the right to set
*/
public void setRight(IntWritable right) {
this.right = right;
} @Override
public void write(DataOutput out) throws IOException {
name.write(out);
right.write(out);
} @Override
public void readFields(DataInput in) throws IOException {
name.readFields(in);
right.readFields(in);
} @Override
public int compareTo(SortKey o) {
int cmp = name.compareTo(o.name);
if(cmp != 0){
return cmp;
}else{
return right.compareTo(o.right);
}
}
    <span style="white-space:pre">    </span>//到目前为止,你只能将其作为key来使用,但是如果你需要按照key的某一个值来排序,以下是重点
static{
WritableComparator.define(SortKey.class, new Comparator());
} public static class Comparator extends WritableComparator{ private static final Text.Comparator TEXT_COMPARATOR = new Text.Comparator(); protected Comparator() {
super(SortKey.class);
} /* (non-Javadoc)
* @see org.apache.hadoop.io.WritableComparator#compare(byte[], int, int, byte[], int, int)
*/
@Override
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
try{
int firstL1 = WritableUtils.decodeVIntSize(b1[s1]) + readVInt(b1, s1);
int firstL2 = WritableUtils.decodeVIntSize(b2[s2]) + readVInt(b2, s2);
return TEXT_COMPARATOR.compare(b1, s1, firstL1, b2, s2, firstL2);
}catch(Exception e){
throw new IllegalArgumentException(e);
}
}
} }

hadoop复合键排序使用方法的更多相关文章

  1. python 字典 分别根据值或键进行排序的方法

    最近经常遇到根据字母出现的频率进行排序的题目 我的思路一般是借用字典统计字母出现的频率 然后对字典按照值进行排序 但是每次按照值进行排序时 都会忘记排序方法 在此记录一下,以加深印象 字典原始值如下: ...

  2. 一起学Hadoop——二次排序算法的实现

    二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常 ...

  3. hadoop MapReduce辅助排序解析

    1.数据样本,w1.csv到w5.csv,每个文件数据样本2000条,第一列是年份从1990到2000随机,第二列数据从1-100随机,本例辅助排序目标是找出每年最大值,实际上结果每年最大就是100, ...

  4. Hadoop之WritableComprale 排序

    Hadoop之WritableComprale 排序 Hadoop只对key进行排序 排序是 MapReduce 框架中最重要的操作之一.Map Task 和 Reduce Task 均会对数据(按照 ...

  5. 使 SortList 实现重复键排序

    SortList 默认对按Key来排序,且Key值不能重复,但有时可能需要用有重复值的Key来排序,以下是实现方式: 1.对强类型:以float为例 #region 使SortList能对重复键排序 ...

  6. 2 weekend110的hadoop的自定义排序实现 + mr程序中自定义分组的实现

    我想得到按流量来排序,而且还是倒序,怎么达到实现呢? 达到下面这种效果, 默认是根据key来排, 我想根据value里的某个排, 解决思路:将value里的某个,放到key里去,然后来排 下面,开始w ...

  7. MySQL删除外键定义的方法

    MySQL外键在定以后,如果我们不再需要这个外键,可以进行删除操作,下面就为您介绍MySQL删除外键定义的方法,供您参考. 不知道大家有没有发现,在定义外键的时候articles.member_id外 ...

  8. discuz x2 个人资料项排序问题解决方法、添加自定义字段、修改栏目名称和介绍

    第一次写文章,希望与人提供方便同时,别误人子弟,自己研究的,大家看不懂只改文件就可以了,如果发现不对的地方请回复或直接通知我,谢谢,本来想在discuz论坛上发的,不懂版规也没时间看版规,怕发错,隔小 ...

  9. Oracle中中文、数字,英文混杂形式的字段进行排序的方法

    http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by ...

随机推荐

  1. github Git-fork-别人的项目后更新代码的方法

     用github还处于菜的阶段,遇到问题简单记录.   举个例子,需要 fork 这个项目 https://github.com/tarobjtu/WebFundamentals.git 点击 for ...

  2. Centos 6\7 防火墙入门配置

    Centos 6 -- iptables iptables 用法: iptables (选项) (参数) 选项: -t<表>:指定要操纵的表: -A:向规则链中添加条目: -D:从规则链中 ...

  3. LVS+Keepalived+Tomcat实现高可用性及均衡负载

    1.Keepalived简介 Keepalived是Linux下一个轻量级别的高可用解决方案.Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考 ...

  4. 关于setTimeout()你所不知道的地方,详解setTimeout()

    关于setTimeout()你所不知道的地方,详解setTimeout() 前言:看了这篇文章,1.注意setTimeout引用的是全部变量还是局部变量了,当直接调用外部函数方法时,实际上函数内部的变 ...

  5. ASP.NET动态生成GridView的使用

    根据DataTable动态生成包含checkbox的GridView,其中DataTable中对应checkbox那一列的值必须为bool值. public static GridView Dynam ...

  6. Pandas排序

    Pandas有两种排序方式,它们分别是 - 按标签 按实际值 下面来看看一个输出的例子. import pandas as pd import numpy as np unsorted_df=pd.D ...

  7. scjp考试准备 - 11 - 类型转换2

    题目如下: interface Foo{} class Alpha implements Foo{} class Beta extends Alpha{} public class Delta ext ...

  8. SkyDNS试用

    SkyDNS试用 简介 SkyDNS是kubernetes用于服务发现的默认的开源DNS服务.本文将抛开kubernetes单独体验SkyDNS.其开源在github.依赖与etcd作为数据存储. 其 ...

  9. EditText实现输入限制和校验

    EditText实现输入限制和校验 一.方法 1)输入限制 1.通过android:digits限制只能输入小写abc android:digits="abc" 2.通过andro ...

  10. 四十 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)倒排索引

    倒排索引 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引 ...