自定义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