上次我們做了簡單的一個wordcount案例,下邊我們在做一個複雜一點的小案例。
例如傳輸一個對象到wordcount中,輸入資料格式如下:
期望輸出的資料格式:
hadoop支援大量資料進行分布式存儲,便于計算向資料移動。但是上邊的資料是多個,但在hadoop中并沒有支援對象這種複雜型資料類型,那該如何進行傳輸呢?
那我們對應上邊的資料進行封裝,那封裝的對象該如何傳遞呢?
這裡是不是會想到RPC架構裡的資料傳遞,使用序列化。對的,hadoop也使用了自己的序列化方案。
那它和我們普通的序列化比較有何不同呢?
1.緊湊:存儲空間更少
2.快速:傳輸速度更快
3.互操作:支援多語言操作
分析:
我們需要将上邊一條資料,利用Tab分隔符進行分割,得到每一個資料,
然後對其進行封裝到我們自定義的一個對象中去。
那自定義的對象要如何,序列化呢?hadoop有沒有現成的序列化和反序列化呢?
我們可以檢視之前小案例中的IntWriteable或者LongWriteable類,
他們可以在hadoop的序列化和反序列化中傳遞,都實作了一個相同的接口WritableComparable接口。
在進入檢視WritableComparable接口,可以看到是繼承了Writable和Comparable接口。這2個接口都有什麼方法呢?
在Writable接口中,我們看到了序列化和反序列化的方法注釋和解釋
在Comparable接口中,我們看到了排序的方法注釋和解釋,針對我們的key進行排序
那我們就仿照這這個來定義一下我們要傳遞的對象
運作我們的driver類,我們可以到我們的輸出路徑上看到我們的結果,是按手機号碼排序的一個結果
如下圖:
輸入檔案:

輸出檔案:
具體實作對象序列化步驟如下:
必須實作WritableComparable接口
反序列化時,需要反射空構造函數,必須有空構造函數
重寫序列化write方法
重寫反序列化readFields方法
注意反序列化的順序和序列化順序完全一緻
要想把結果顯示在檔案中,需要重寫toString(),可用'\t'分開,友善後續使用。
如果需要将自定義的bean放在key中傳輸,則還需要實作Comparable接口的方法,
因為MapReduce架構中有排序的過程,必須要按某一個key進行升序排列