mapreduce自定義分組、自定義分割槽、二次排序
阿新 • • 發佈:2019-02-08
mapreduce中二次排序的思想中,我們常常需要對資料的分割槽分組進行自定義,
以下就介紹一下自定義分割槽分組的簡單實現
1、自定義分割槽:
public class demoPartitioner<K, V> extends Partitioner<K, V>{ @Override //注意有幾個分割槽reduce任務就有幾個 public int getPartition(K key, V value, int numPartitions) { String op=key.toString(); switch(op) { case "張村":return 0; case "李村":return 1; case "王村":return 2; case "趙村":return 3; } return 4; } }
要注意的是:設定了分割槽之後,reduce任務的個數就只能設定和分割槽數量一樣的個數了!!
2、自定義分組:
class demoGroup implements RawComparator<CombineKey> { public int compare(Object o1, Object o2) { return 0; } /** * b1 第一個參與比較的位元組陣列 * s1 第一個位元組陣列中開始比較的位置 * l1 第一個位元組陣列參與比較的長度 * b2 第二個參與比較的位元組陣列 * s2 第二個位元組陣列中開始比較的位置 * l2 第二個位元組陣列參與比較的長度 */ public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { return WritableComparator.compareBytes(b1, s1, 1, b2, s2, 1); } }
3、場景模擬:對於二次排序的思想
當出現以下需求
A 1 1 A 1 1
B 2 3 》》 A 2 0
A 2 0 B 2 3
這個時候可以讓A1、A2、B2這三個當做key來排序,
實現排序功能,但這個時候A1,A2不應該在不同的分割槽或者組內
顯然A、B應為分割槽,分組的條件,這時候就需要自定義分割槽和分組了