hadoop详解(十二) 自定义Writable

自定义Writable

hadoop虽然已经实现了一些非常有用的Writable,而且你可以使用他们的组合做很 多事情,但是如果你想构造一些更加复杂的结果,你可以自定义Writable来达到你的目的,我们以注释的方式 对自定义Writable进行讲解(不许说我只帖代码占篇幅哦,姿势写在注释里了):

package com.sweetop.styhadoop;  

import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;  

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;  

/**
 * Created with IntelliJ IDEA.
 * User: lastsweetop
 * Date: 13-7-17
 * Time: 下午8:50
 * To change this template use File | Settings | File Templates.
 */
public class EmploeeWritable implements WritableComparable<EmploeeWritable>{  

    private Text name;
    private Text role;  

    /**
     * 必须有默认的构造器皿,这样Mapreduce方法才能创建对象,然后通过readFields方法从序列化的数据

流中读出进行赋值
     */
    public EmploeeWritable() {
        set(new Text(),new Text());
    }  

    public EmploeeWritable(Text name, Text role) {
        set(name,role);
    }  

    public void set(Text name,Text role) {
        this.name = name;
        this.role = role;
    }  

    public Text getName() {
        return name;
    }  

    public Text getRole() {
        return role;
    }  

    /**
     * 通过成员对象本身的write方法,序列化每一个成员对象到输出流中
     * @param dataOutput
     * @throws IOException
     */
    @Override
    public void write(DataOutput dataOutput) throws IOException {
        name.write(dataOutput);
        role.write(dataOutput);
    }  

    /**
     * 同上调用成员对象本身的readFields方法,从输入流中反序列化每一个成员对象
     * @param dataInput
     * @throws IOException
     */
    @Override
    public void readFields(DataInput dataInput) throws IOException {
        name.readFields(dataInput);
        role.readFields(dataInput);
    }  

    /**
     * implements WritableComparable必须要实现的方法,用于比较  排序
     * @param emploeeWritable
     * @return
     */
    @Override
    public int compareTo(EmploeeWritable emploeeWritable) {
        int cmp = name.compareTo(emploeeWritable.name);
        if(cmp!=0){
            return cmp;
        }
        return role.compareTo(emploeeWritable.role);
    }  

    /**
     * MapReduce需要一个分割者(Partitioner)把map的输出作为输入分成一块块的喂给多个reduce)
     * 默认的是HashPatitioner,他是通过对象的hashcode函数进行分割,所以hashCode的好坏决定
     * 了分割是否均匀,他是一个很关键性的方法。
     * @return
     */
    @Override
    public int hashCode() {
        return name.hashCode()*163+role.hashCode();
    }  

    @Override
    public boolean equals(Object o) {
        if(o instanceof EmploeeWritable){
            EmploeeWritable emploeeWritable=(EmploeeWritable)o;
            return name.equals(emploeeWritable.name) && role.equals

(emploeeWritable.role);
        }
        return false;
    }  

    /**
     * 如果你想自定义TextOutputformat作为输出格式时的输出,你需要重写toString方法
     * @return
     */
    @Override
    public String toString() {
        return name+"\t"+role;
    }
}

Writable对象是可更改的而且经常被重用,因此尽量避免在write和readFields中分配对象。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, return
, text
, public
, name
, role
, Writable
, 自定义分割月
equal比较对象详解
hadoop配置文件详解、hadoop原理详解、hadoop技术详解、hadoop rpc 详解、hadoop shuffle详解,以便于您获取更多的相关知识。

时间: 2024-11-01 14:09:37

hadoop详解(十二) 自定义Writable的相关文章

hadoop详解(十) 序列化与Writable接口

简介 序列化和反序列化就是结构化对象和字节流之间的转换,主要用在内部进程的通讯和持久化存储方 面. 通讯格式需求 hadoop在节点间的内部通讯使用的是RPC,RPC协议把消息翻译成二进制字节流发 送到远程节点,远程节点再通过反序列化把二进制流转成原始的信息.RPC的序列化需要实现以下几点: 1. 压缩,可以起到压缩的效果,占用的宽带资源要小. 2.快速,内部进程为分布式系统构建了高速链路,因 此在序列化和反序列化间必须是快速的,不能让传输速度成为瓶颈. 3.可扩展的,新的服务端为新的客户 端增

hadoop详解(十一) 序列化与Writable实现

简介 在hadoop中,Writable的实现类是个庞大的家族,我们在这里简单的介绍一下常用来做序列化的一部分. java原生类型 除char类型以外,所有的原生类型都有对应的Writable类,并且通过get和set方法可以他们的值. IntWritable和LongWritable还有对应的变长VIntWritable和VLongWritable类. 固定长度还是变长的选用类似与数据库中的char或者vchar,在这里就不赘述了. Text类型 Text类型使用变长int型存储长度,所以Te

CMake 手册详解(二十)

SirDigit   CMake 手册详解(二十) CMD#51: list 列表操作命令. list(LENGTH <list> <output variable>) list(GET <list> <element index> [<element index> ...] <output variable>) list(APPEND <list> <element> [<element> ...

Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSDK分享组件的,奈何需要去注册各平台的账号,还要审核,有些审核还挺久,就没办法,改为写这个Bmob了,相信大家对Bmob都是挺期待的吧,因为他作为Android后端的实现很好的支持,国内很多软件都在使用它,他的功能也是特别神奇,这里就不一一细说了,我们用实际的例子来见证他的神奇 官网:http://w

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)  [顶]ORACLE PL/SQL编程详解之二:   PL/SQL块结构和组成元素(为山九仞,岂一日之功)     继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不

详解AngularJS中自定义指令的使用

  这篇文章主要介绍了详解AngularJS中自定义指令的使用,包括结合自定义HTML标签的使用,需要的朋友可以参考下 自定义指令中使用AngularJS扩展HTML的功能.自定义指令使用的"指令"的功能定义.自定义指令只是替换了它被激活的元素.引导过程中AngularJS应用程序找到了匹配的元素,并做好使用自定义指令compile()方法一次活动再处理使用基于指令的范围自定义指令link()方法的元素. AngularJS提供支持,以下列元素的类型来创建自定义指令. Element

C++高级进阶 第四季:const详解(二) 常量折叠

一.文章来由 const详解之二 二.const 代替 #define const最初动机就是代替 #define. const 优于 #define: (1) #define没有类型检查,const在编译期(而不是预编译期)做类型检查: (2)const方便调试和定位bug. 所以应该完全用const代替#define 三.头文件中的const (1)要使用const代替#define,同样需要把const定义放进头文件(或其他格式文件,include即可).这样通过包含头文件,可把const

Ajax基础详解教程(二)_AJAX相关

在上篇文章给大家介绍了Ajax基础详解教程(一),讲到Ajax中open方法的第三个参数异步和同步的问题,今天呢,就来继续往下唠,先接着上回的代码 var oBtn = document.getElementById('btn'); oBtn.onclick = function(){ var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject('Mic

WebService教程详解(二)_java

在上篇文章给大家介绍了WebService教程详解(一) 使用工具的原因: 1. 使用工具可以更好的了解WebService请求的过程 2. 使用工具WsExplore可以获取SOAP数据发送和接收的格式 3. 使用工具Tcp/Ip Monitor可以监控拦截器请求头和响应头的具体数据 什么是SOAP? SOAP是一种基于XML编码规范的文本协议,简单的说SOAP就是在HTTP的基础上传输XML数据,以实现远程调用[无论你的服务端是什么语言书写的,只要接收SOAP协议的XML数据,并返回SOAP