hadoop复合键排序使用方法

在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);
			}
		}
	}

}
时间: 2024-10-15 22:15:04

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

Hadoop 高级程序设计(一)---复合键 自定义输入类型

简介: 在大数据处理的基本方法上,对于相互间计算的依赖性不大的数据,mapreduce采用分治的策略进行处理,将大的问题划分成小的问题进行求解,使得问题变得简单可行,同时在处理问题上面,MapReduce框架隐藏了很多的处理细节,将数据切分,任务调度,数据通信,容错,负载均衡.....交给了系统负责,对于很多问题,只需要采取框架的缺省值完成即可,用户只需完成设计map函数很reduce函数即可. 复合键 在一般的情况下只需要使用简单的<key,value>对即可,但是在一些复杂的情况下可以完成

hadoop二次排序的个人理解

看了多篇文档,现总结自己对二次排序的理解:1.流程 各个阶段:input ---> split --> recordreader --> 形成复合键值对textpair  --> 分区(setGroupingComparatorClass设置的分区方法)输出  --> 对每个分区进行排序setSortComparatorClass(按照设定的排序方式对textpair进行排序,其实这已经进行了一次二次排序了)  --> shuffle阶段  --> 内部排序(用s

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

二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常是不固定的.但是我们经常会遇到同时对key和value排序的需求,例如Hadoop权威指南中的求一年的高高气温,key为年份,value为最高气温,年份按照降序排列,气温按照降序排列.还有水果电商网站经常会有按天统计水果销售排行榜的需求等等,这些都是需要对key和value同时进行排序.如下图所示:

Hadoop二次排序的其他写法

二次排序原理 在map阶段,使用job.setInputFormatClass定义的InputFormat将输入的数据集分割成小数据块splites,同时InputFormat提供一个RecordReder的实现. 本例子中使用的是TextInputFormat,他提供的RecordReader会将文本的字节偏移量作为key,这一行的文本作为value. 这就是自定义Map的输入是<LongWritable, Text>的原因.然后调用自定义Map的map方法,将一个个<LongWrit

Hadoop实现全排序

1.1TB(或1分钟)排序的冠军 作为分布式数据处理的框架,集群的数据处理能力究竟有多快?或许1TB排序可以作为衡量的标准之一. 1TB排序,就是对1TB(1024GB,大约100亿行数据)的数据进行排序.2008年,Hadoop赢得1TB排序基准评估第一名,排序1TB数据耗时209秒.后来,1TB排序被1分钟排序所取代,1分钟排序指的是在一分钟内尽可能多的排序.2009年,在一个1406个节点组成的hadoop集群,在59秒里对500GB完成了排序:而在1460个节点的集群,排序1TB数据只花

Hadoop 使用 MapReduce 排序 思路、全局排序

本文主要讲对key的排序,主要利用hadoop的机制进行排序. 1.Partition partition作用是将map的结果分发到多个Reduce上.当然多个reduce才能体现分布式的优势. 2.思路 由于每个partition内部是有序的,所以只要保证各partition间有序,即可保证全部有序. 3.问题 有了思路,如何定义partition的边界,这是个问题. 解决办法:hadoop提供了一个采样器帮我们预估整个边界,以使数据的分配尽量平均 引用:http://stblog.baidu

对map的value进行排序的方法

对map的value进行排序的方法,注意思路,以及CMPBYVALUE的用法 <h1 class="title" style="margin: 10px 0px; font-family: 'lucida grande', 'lucida sans unicode', lucida, helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif; line-heig

解决VNC中tab键无效的方法

http://ubuntuforums.org/archive/index.php/t-1771058.html I accidentally discovered a fix for this while trying to solve a different problem.edit~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xmlfind the line <property name="&l

NSMutableDictionary 类中增加键值对方法分析

在iOS中可变字典增加一个键值对的方法有setObject: forKey: 和setValue : forKey: .为了方便我们把这两个方法简称为方法A和方法B. B这个方法中其中的value值是不能为nil,否则程序会出项崩溃.而A方法中的这个value可以为nil,但是当这个value位nil时,系统会自动调用removeObjectforKey:这个方法.这样就把这个键值对删除掉了.B方法中的key值可以是任意类型的,但是这个类型必须要实现NSCopying协议.而A方法中它的key值