hadoop中实现定制Writable类

Hadoop中有一套Writable实现可以满足大部分需求,但是在有些情况下,我们需要根据自己的需要构造一个新的实现,有了定制的Writable,我们就可以完全控制二进制表示和排序顺序。

为了演示如何新建一个定制的writable类型,我们需要写一个表示一对字符串的实现:

blic class TextPair implements WritableComparable<TextPair> {private Text first;private Text second;public TextPair() {set(new Text(), new Text());}public TextPair(String first, String second) {set(new Text(first), new Text(second));}public TextPair(Text first, Text second) {set(first, second);}public void set(Text first, Text second) {this.first = first;this.second = second;}public Text getFirst() {return first;}public Text getScond() {return second;}public void write(DataOutput out) throws IOException {first.write(out);second.write(out);}public void readFields(DataInput in) throws IOException {first.readFields(in);second.readFields(in);}public int hashCode() {return first.hashCode() * 163 + second.hashCode();}public boolean equals(Object o) {if(o instanceof TextPair) {TextPair tp = (TextPair)o;return first.equals(tp.first) && second.equals(tp.second);}return false;}public String toString() {return first + "\t" + second;}public int compareTo(TextPair tp) {int cmp = first.compareTo(tp.first);if(cmp != 0) {return cmp;}return second.compareTo(tp.second);}    
}

为速度实现一个RawComparator

还可以进一步的优化,当作为MapReduce里的key,需要进行比较时,因为他已经被序列化,想要比较他们,那么首先要先反序列化成一个对象,然后再调用compareTo对象进行比较,但是这样效率太低了,有没有可能可以直接比较序列化后的结果呢,答案是肯定的,可以。

RawComparator接口允许执行者比较流中读取的未被反序列化为对象的记录,从而省去了创建对象的所有的开销,其中,compare() 比较时需要的两个参数所对应的记录位于字节数组b1和b2指定开始位置s1和s2,记录长度为l1和l2,代码如下:

public interface RawComparator<T> extends Comparator<T> {public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2);
}

以IntWritable为例,它的RawComparator实现中,compare() 方法通过readInt()直接在字节数组中读入需要比较的两个整数,然后输出Comparable接口要求的比较结果。

值得注意的是,该过程中compare()方法避免使用IntWritable对象,从而避免了不必要的对象分配,相关代码如下:

  /** A Comparator optimized for IntWritable. */ public static class Comparator extends WritableComparator {public Comparator() {super(IntWritable.class);}public int compare(byte[] b1, int s1, int l1,byte[] b2, int s2, int l2) {int thisValue = readInt(b1, s1);int thatValue = readInt(b2, s2);return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1));}}

Writablecomparator是RawComparator对WritableComparable类的一个通用实现,它提供两个主要功能:

1、提供了一个RawComparator的compare()默认实现,该实现从数据流中反序列化要进行比较的对象,然后调用对象的compare()方法进行比较

2、它充当了RawComparator实例的一个工厂方法。例如,可以通过下面的代码获得IntWritable的RawComparator:

RawComparator<IntWritable> comparator = WritableComparator.get(IntWritable.class);

我们只需要把EmploeeWritable的序列化后的结果拆成成员对象,然后比较成员对象即可:

class Comparator extends WritableComparator {private static final Text.Comparator TEXT_COMPARATOR = new Text.Comparator();public Comparator() {super(TextPair.class);}public int compara(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);int cmp = TEXT_COMPARATOR.compare(b1, s1, firstL1, b2, s2, firstL2);if(cmp != 0) {return cmp;}return TEXT_COMPARATOR.compare(b1, s1 + firstL1, l1 - firstL1, b2, s2 + firstL2, l2 -  firstL2);} catch(IOException e) {throw new IllegalArgumentException(e);}}
}

 

定制comparators

有时候,除了默认的comparator,你可能还需要一些自定义的comparator来生成不同的排序队列,看一下下面这个示例:

    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 (IOException e) {throw new IllegalArgumentException(e);}}public int compare(WritableComparable a, WritableComparable b) {if(a instanceof Textpair && b instanceof TextPair) {return ((TextPair) a).first.compareTo(((TextPair) b).first);}return super.compare(a, b);}

 

转载于:https://www.cnblogs.com/wuyudong/p/4332080.html

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

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

相关文章

html5carousel图片轮播,jQuery响应式轮播图插件VM Carousel

插件描述&#xff1a;VM Carousel是一款jQuery响应式轮播图插件。该jquery轮播图插件支持自动播放模式&#xff0c;支持动态改变图片尺寸&#xff0c;支持居中模式&#xff0c;以及无限循环等。使用方法在页面中引入jquery.vm-carousel.css&#xff0c;jquery和jquery.vm-carou…

tableview或scrollview Y轴发生变化解决方案

在viewDidLoad中加入 self.automaticallyAdjustsScrollViewInsets NO; 转载于:https://www.cnblogs.com/mo-shou/p/4335163.html

NOIP 货车运输

题目描述 Description A 国有 n 座城市&#xff0c;编号从 1 到 n&#xff0c;城市之间有 m 条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。现在有 q 辆货车在运输货物&#xff0c;司机们想知道每辆车在不超过车辆限重的情况下&#xff0c;最多能运多重的货物…

那是计算机房吗英语否定回答,【微课+教材+听力+知识点】PEP四年级英语下册 Unit 1...

原标题&#xff1a;【微课教材听力知识点】PEP四年级英语下册 Unit 1微课&#xff1a;Unit 1-PartA微课&#xff1a;Unit 1-PartB微课&#xff1a;Unit 1-PartC课文教材动画教材听力Unit 1 My schoolUnit 1 单词▲点右上方绿标即可收听Words in Unit 1first floor [ˌfɜːst ˈ…

django html显示xml,如何将HTML与Django集成?

Django可能会为此而大肆渲染。如果您想要的只是一种将表单链接到某些后端Python代码的方法&#xff0c;那么像Flask这样的微框架可能是更好的选择。下面是你如何用烧瓶做一个简单的表格&#xff1a;创建一个目录project&#xff0c;其中有一个目录templates你的模板很简单&…

PropertyGrid控件 分类(Category)及属性(Property)排序

最近在做表单设计器&#xff0c;设计器上的控件都是我们自己封装的&#xff0c;但每个属性类别里的属性是按照属性的拼音排序的&#xff0c;现在想按照PropertyIndex标识进行排序&#xff08;PropertyIndex的后三位是用来标识编辑器的&#xff09;。 具体实现如下&#xff1a; …

css3标签

-moz代表firefox浏览器私有属性 -ms代表ie浏览器私有属性 -webkit代表chrome、safari私有属性 -o代表opera私有属性 border-radius:2em; 向div元素添加圆角边框&#xff0c;这是一种缩小写法&#xff0c;等价于: border-top-left-radius:2em; border-top-right-radius:2em; bor…

用计算机计算出密码,自带计算器的密码

手机、电脑都会有自带的计算器&#xff0c;用惯了简易的计算器功能&#xff0c;不知道有没有感觉 iPhone 自带的计算器难用&#xff1f;后来才发现原来它还可以使用科学计算器进行指数函数、对数函数和三角函数的计算。只需要将 iPhone 转到横排模式就可以&#xff1a;这算不算…

PHP内核探索之变量(6)- 后续内核探索系列大纲备忘

年前因为工作比较饱和&#xff0c;现在又忙着换工作的事情&#xff0c;基本停止了对博文的更新。后续的博文&#xff0c;还是慢慢补上吧。 为了不至于过于发散&#xff0c;先搞个未成形的大纲&#xff0c;如下&#xff1a; PHP内核探索之变量 不平凡的字符串  PHP内核探索之…

ios 开发日记 21 -自动处理键盘事件的第三方库:IQKeyboardManager

我们写界面要考虑很多用户体验问题&#xff0c;键盘事件的响应就是比较麻烦的一种。我们需要监听键盘事件&#xff0c;考虑点击背景收起键盘、考虑键盘遮挡输入框问题等等&#xff0c;而且每个界面都要做这么一套。这个库帮我们解决了这个事情。 这个库的下载地址&#xff1a;h…

shopify在哪里填写html,[Shopify开店教程]添加嵌入代码

添加嵌入代码在Shopify管理员中创建购买按钮后&#xff0c;您就可以将其添加到您自己的网站或博客中。将嵌入代码添加到您网站的源HTML的过程有所不同&#xff0c;具体取决于您希望购买按钮和购物车在您的发布平台上显示的方式和位置&#xff0c;以及有时您在该平台上使用的主题…

activity生命周期图

转载于:https://www.cnblogs.com/aqianglala/p/4344431.html

华硕台式计算机光盘怎么启动不了,华硕笔记本怎么用光盘重装系统 笔记本重装系统失败怎么办...

华硕笔记本是现在非常热门的笔记本品牌&#xff0c;很多的华硕笔记本用户在重装系统的时候&#xff0c;大多数会用上光盘&#xff0c;这种重装方式较为简单&#xff0c;所以备受青眯&#xff0c;不过呢还是有很多电脑用户不知道怎么用光盘重装系统&#xff0c;没关系&#xff0…

怎么安装Win10,硬盘安装Win10系统图文教程

2019独角兽企业重金招聘Python工程师标准>>> http://jingyan.baidu.com/article/f25ef254613ffd482c1b8236.html 分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友…

iOS高级必备

1.你使用过Objective-C的运行时编程&#xff08;Runtime Programming&#xff09;么&#xff1f;如果使用过&#xff0c;你用它做了什么&#xff1f;你还能记得你所使用的相关的头文件或者某些方法的名称吗&#xff1f; Objecitve-C的重要特性是Runtime&#xff08;运行时&…

游戏计算机重要参数,这真的很重要吗 游戏鼠标三大参数之谜

1游戏鼠标三大参数&#xff1a;采样率[中关村在线键鼠频道原创]游戏鼠标作为目前最受消费者关注的外设产品&#xff0c;其销量以及利润在市场上也是表现最为出色的&#xff0c;众多游戏外设厂商也推出各种各样的游戏鼠标&#xff0c;各种霸气的名字更是让我们看的眼花缭乱&…

[Android]Activity启动过程

Android系统启动加载流程&#xff1a; 参考图 Linux内核加载完毕启动init进程init进程fork出zygote进程zygote进程在ZygoteInit.main()中进行初始化的时候fork出SystemServer进程SystemServer进程开启的时候初始化ActivityThread和ActivityManagerService&#xff08;其它还有P…

CentOS 7 中firewall-cmd命令

在 CentOS 7 暂时开放 ftp 服务# firewall-cmd --add-serviceftp永久开放 ftp 服务# firewall-cmd --add-serviceftp --permanent永久关闭# firewall-cmd --remove-serviceftp --permanentsuccess让设定生效# systemctl restart firewalld检查设定是否生效# iptables -L -n | g…

计算机网络又称国际互联网,Internet属于( )。 A.国际互联网B.内部网C.局域网D.电话网 - 作业在线问答...

相关题目与解析Internet属于()。A.内部网B.局域网C.公用电话网D.国际互联网Internet称为()。A&#xff0e;国际互联网B&#xff0e;广域网C&#xff0e;局域网D&#xff0e;世界信息网INTERNET也称为()。A.局域网B.对等网C.国际互联网D.以太网因特网(Internet)又称A、局域网B、…

substring 在C#,Javascript,SQL 中index开始值

substring函数index参数在三个平台的开始值: 平台index参数开始值C#0Javascript0SQL1转载于:https://www.cnblogs.com/jimcsharp/p/4354192.html