自定義一個 Writable 類型 TextPair
為了演示如何創建一個自定義Writable,編寫了一個表示一對字元串的實現,名為TextPair,例6-6顯示了最基本的實現。
例6-6存儲一對Text對象的Writable。
import java.io, * ;
import org. apache. hadoop. io. *;
public class TextPair implementsWritableComparable {
private Text first;
private Text second;
publicTextPair ( ){
set (new Text ( ) , new Text ( ));
}
public TextPair (String first, Stringsecond) {
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 getSecond( ) {
return second;
}
@ Override
public void write (DataOutput out) throwsIOException {
first.write (out);
second. write(out);
}
@ Override
public void readFields (Datalnput in)throws IOException {
first .readFields (in);
second.readFields (in);
}
@ Override
public int hashCode( ) {
return first .hashCode ( ) * 163 + second. hashCode ( );
}
@Override
public boolean equals (Object o) {
if (o instanceof TextPair){
TextPair tp = (TextPair) o;
return first.equals (tp.first) && second.equals(tp.second);
}
return false;
}
@ Override
public String toString( ) {
return first + 「 」 + second;
}
@ Override
public int compareTo (TextPair tp) {
int cmp= first.compareTo (tp.fi rst);
if (cmp != 0) {
return cmp;
}
return second.compareTo (tp. second);
}
}
此實現的第一部分直觀易懂:包括兩個Text實例變數(first和second)和相關的構造函數,以及setter方法和getter方法(即設置函數和提取函數)。所有的Writable實現都必須有一個默認的構造函數,以便MapReduce框架能夠對它們進行實例化,進而調用readFields( )方法來填充它們的欄位。Writable實例是易變的,並且通常可以重用,所以應該盡量避免在write( )或readFields( )方法中分配對象。
通過委託給每個Text對象本身,TextPair的write( )方法依次序列化輸出流中的每一個Text對象。同樣,也通過委託給Text對象本身,readFields()反序列化輸人流中的位元組。DataOutput和DataInput介面有一套豐富的方法用於序列化和反序列化Java基本類型。所以,在通常情況下,可以完全控制Writable對象的數據傳輸格式。
就像為Java寫的任意值對象一樣,需要重寫java. lang. Object的hashCode()方法、equals( )方法和toString( )方法。HashPartitioner (MapReduce中的默認分區類)通常使用hashCode( )方法來選擇reduce分區,所以應該確保有一個較好的哈希函數來確保reduce函數的分區在大小上是相當的。
TextPair是WritableComparable的一個實現,所以它提供了compareTo( )方法,該方法可以強制數據排序:先按照第一個字元排序,如果第一個字元相同則按照第二個字元排序。需注意的是,TextPair不同於前面的TextArrayWritable類(除了它可以存儲Text對象數之外),因為TextArrayWritable只繼承了Writable,並沒有繼承WritableComparable。
TAG:穗先大數據諮詢 |
※用兩天時間和一家酒店定義一個英文單詞「Stay-cation」
※小鄭搞碼事:用CSS3可以去掉select三角箭頭,然後自定義一個圖片
※從灶台到螺絲 Fendi重新定義一個奢華的廚房
※不服BUFF:你如何定義一個職業的輸出是否「墨跡」?
※阿里巴巴CTO張建鋒:中國有機會用數字化重新定義一個未來
※西裝上的這10大細節定義一個男人
※重新定義一個至關重要的科學概念
※如何用數學方法來定義一個人與人的社交距離?
※如何定義一個人外表很完美?
※從定義一個好問題開始
※齊家網成家裝垂直平台第一股 鄧華金要給互聯網家裝定義一個新賽道
※前教練:阿利森是門將中的梅西,他足以定義一個時代
※5萬日軍猛攻孤城太原,傅作義一個軍萬餘人血戰突圍
※馬上林沖在水滸傳梁山打不過的二人一個是盧俊義一個就是此人了
※趙光義一個失誤決定,導致高懷德戰死沙場!潘仁美該負什麼責任?