當前位置:
首頁 > 最新 > 自定義一個 Writable 類型 TextPair

自定義一個 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萬日軍猛攻孤城太原,傅作義一個軍萬餘人血戰突圍
馬上林沖在水滸傳梁山打不過的二人一個是盧俊義一個就是此人了
趙光義一個失誤決定,導致高懷德戰死沙場!潘仁美該負什麼責任?