1. 程式人生 > >選擇合適的Hadoop資料型別

選擇合適的Hadoop資料型別

 為了用作Mapreduce計算的value資料型別,資料型別必須實現org.apache.hadoop.io.Writable介面。Writable介面定義了當需要資料傳輸和資料儲存時,Hadoop應如何序列化和反序列化值。
 為了用作Mapreduce計算的key資料型別,資料型別必須實現org.apache.hadoop.io.WritableComparable<T>介面。除了Writable介面的功能之外,有一種WritableComparable介面更進一部定義瞭如何將這種型別的鍵相互比較,以達到排序的目的。

Hadoop的可寫介面與java的可序列化介面對比

 與統一的java本機序列的框架相比,Hadoop的基於可寫的序列框架為MapReduce程式提供了更高興,定製程度更高的序列化和資料表示。相對於java的序列化,Hadoop的可寫框架並不記錄型別名稱,每個物件期望序列化資料的所有客戶端必須直到在序列化資料中使用的型別。省略型別名稱,使序列化過程更快,結果更緊湊,同時,通過非java的客戶端可以很容易的實現隨機訪問序列化資料格式的功能。
 Hadoop基於可寫的序列化方式,也具有通過複用Writable物件來減少物件建立開銷的功能,這時java本身序列化框架不可能做到的。

hadoop提供一些基本資料型別,如Intwritable/Longwritable/Boolean/writable/FloatWritable和ByteWritable,這時他們各自的java基本上資料型別的Writable版本。可以使用這些型別作為key型別和value型別。

下面是幾種Hadoop的內建資料型別,既可以用作key型別,也可以用作value型別。

Text:儲存UTF8文字
BytesWritable:儲存一個位元組序列
VIntWritable和VLongWritable:儲存變長整型和長整型值
NullWritable:這是一個零長度的Writable型別,可以在不希望使用key或value型別的時候使用。

下列Hadoop內建的集合資料型別只能用作value型別:

ArrayWritable:儲存屬於Writable型別的值陣列。要使用ArrayWritable型別作為reduce輸入的value型別,則需要建立ArrayWritable的子類來指定儲存在其中的Writable值的型別。
TwoDArrayWritable:儲存屬於同一Writable型別的值矩陣。要使用TwoDArrayWritable型別作為reduce輸入的value型別,則需要通過建立與ArrayWritable型別相似的TwoDArrayWritable型別的子類來指定儲存的值的型別。
MapWritable:儲存鍵值對的對映。鍵和值應該是Writable資料型別。
SortedMapWritable:儲存鍵值對的有序對映。鍵應該實現writableComparable介面。