自定義實現Hadoop Key-Value

自定義實現Value

如果需要自定義一個一個Value類型,那麼需要實現Hadoop預定義接口org.apache.hadoop.io.WritableWritable包含兩個重要的方法:readFieldswrite,主要用於數據的序列化和反序列化。對於Writable的子類的成員變量必須是Java的基本類型或者是其他實現了Writable接口的類型。如果是Java的基本類型則可以使用DataInput的相應方法進行成員變量的讀寫,例如:

int  responseSize = in.readInt();

String  userIP = in.readUTF();

如果是實現了Writable接口的類型可以使用該類型的writereadFields方法進行數據的讀寫,例如:

Text name=new Text(); 

name.readFields(in);

注意事項:

(1)如果過實現接口Writable的自定義類型包含構造函數,一定需要書寫參數爲空的自定義函數(2)如果Hadoop應用採用了TextOutputFormat作爲輸出格式並且採用了自定義Key或者Value,因爲TextOutputFormat採用valuetoString方法進行最後結果的輸出,因此在自定義Writable的時候需要根據需要實現一個有意義的toString方法(3)當Hadoop進行輸入處理的時候,Hadoop一般會重複使用keyvalue對象,主要注意上一次讀取的數據會不會對本次處理產生影響。

自定義實現Key:

作爲Hadoop Key,需要具備比較功能,以便hadoop進行分區和排序。因此,Key需要實現兩個接口,一個是Writable接口;一個是WritableComparable接口。WritableComparable增加了一個compareTo方法,用來進行對象的比較。

注意事項:

一般情況下采用compareTo方法就能滿足應用需求,但是該方法需要將二進制數據反序列化成對象,因此性能不是特別高。爲此,Hadoop一般爲每一種Writable類型提供一種RawComparator,用來進行二進制數據的比較。如果需要使用RawComparator,則首先需要繼承WritableComparator並自定義實現其中的compare方法;然後,通過     WritableComparator.define(IntWritable.class, new Comparator())方法完成該類對應比較程序的註冊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章