标签:
Hadoop的自定制数据类型有两种,一种较为简单的是针对值,另外一种更为完整针对于键和值都适合package org.apache.hadoop.io; import java.io.DataOutput; import java.io.DataInput; import java.io.IOException; public interface Writable { void write(DataOutput out) throws IOException; void readFields(DataInput in) throws IOException; }
例子:
import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; public class Address implements Writable { public String city; public String street; public int doorplate; public Address() { this("", "", 0); } public Address(String city, String street, int doorplate) { this.city = city; this.street = street; this.doorplate = doorplate; } @Override public void write(DataOutput out) throws IOException { out.writeUTF(this.city); out.writeUTF(this.street); out.writeInt(this.doorplate); } @Override public void readFields(DataInput in) throws IOException { this.city = in.readUTF(); this.street = in.readUTF(); this.doorplate = in.readInt(); } public String toString() { return this.city + "," + this.street + "," + this.doorplate; } }
二、针对于键和值,需要指定排序规则,自定义类需要实现 WritableComparable 泛型接口
package org.apache.hadoop.io; public interface WritableComparable<T> extends Writable, Comparable<T> { } package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T o); }
例子:
import org.apache.hadoop.io.WritableComparable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; public class Address implements WritableComparable { public String city; public String street; public int doorplate; public Address() { this("", "", 0); } public Address(String city, String street, int doorplate) { this.city = city; this.street = street; this.doorplate = doorplate; } @Override public void write(DataOutput out) throws IOException { out.writeUTF(this.city); out.writeUTF(this.street); out.writeInt(this.doorplate); } @Override public void readFields(DataInput in) throws IOException { this.city = in.readUTF(); this.street = in.readUTF(); this.doorplate = in.readInt(); } @Override public int compareTo(Object o) { Address other = (Address) o; int n = this.strCompareTo(this.city, other.city); if (n != 0) return n; n = this.strCompareTo(this.street, other.street); if (n != 0) return n; return (this.doorplate < other.doorplate ? -1 : (this.doorplate == other.doorplate ? 0 : 1)); } public String toString() { return this.city + "," + this.street + "," + this.doorplate; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof Address) { Address other = (Address) obj; return this.strEquals(this.city, other.city) && this.strEquals(this.street, other.street) && this.doorplate == other.doorplate; } return false; } /** * 重写 hashCode() 方法很重要,Hadoop 的 Partitioners 会用到这个方法 */ public int hashCode() { return 13 * (this.city == null ? 0 : this.city.hashCode()) + 67 * (this.street == null ? 0 : this.street.hashCode()) + 151 * this.doorplate; } public boolean strEquals(String a, String b) { return (a == null && b == null) || (a != null && a.equals(b)); } public int strCompareTo(String a, String b) { if (a == null && b == null) return 0; else if (a != null && b == null) return 1; else if (a == null && b != null) return -1; else return a.compareTo(b); } }
标签:
原文地址:http://my.oschina.net/zc741520/blog/375187