我理解自定義分區程序背後的想法。就我而言,我想將所有相同的單詞發送給一個reducer。我知道我可以使用哈希碼來做到這一點。在Hadoop中編寫自定義分區程序的語法
但是,我不確定Hadoop API中分區器的語法。
下面是簽名:
Class Partitioner<KEY,VALUE>
如何選擇鍵,值類型?此外,爲什麼我需要這裏的價值?我不應該只使用該鍵,並返回基於某種邏輯的整數(在我的情況下是散列碼)。
有人可以解釋一個例子的幫助嗎?
我理解自定義分區程序背後的想法。就我而言,我想將所有相同的單詞發送給一個reducer。我知道我可以使用哈希碼來做到這一點。在Hadoop中編寫自定義分區程序的語法
但是,我不確定Hadoop API中分區器的語法。
下面是簽名:
Class Partitioner<KEY,VALUE>
如何選擇鍵,值類型?此外,爲什麼我需要這裏的價值?我不應該只使用該鍵,並返回基於某種邏輯的整數(在我的情況下是散列碼)。
有人可以解釋一個例子的幫助嗎?
語法默認分區(HashPartitioner)是如下
public class HashPartitioner extends Partitioner { public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; } }
密鑰必須是WritableComparable類型,因爲框架具有分選基於鍵和值可以是任何可寫類型,使得,框架可序列化和反序列化以執行他們。
現在,當你要求的值類型的要求讓我們MovieLense案例研究的一個例子,其中一個文件名爲ratings.dat形式
用戶ID :: movieID ::收視數據有: :時間戳
在此評分中,用戶給出的評分範圍爲1-5
現在假設用戶ID是關鍵字,其他值都是重要部分。現在假設你的要求是reducer的輸出文件應該代表評級,比如一個文件包含所有等級爲1的記錄,另一個等級爲2。因此,你的輸出將有5個文件代表評級。
那麼現在在分區器中你可以根據評估值中包含的值來決定發送減速器的記錄,比如如果評分等於1則返回0,如果2則返回1等等。 所以代碼將會如下如下
public class MoviePartitioner extends Partitioner{ @Override public int getPartition(LongWritable userId, Movie value, int arg2) { int rating = Integer.parseInt(value.getMovieRating()); return rating - 1; // as rating starts from 1 } }