1. 程式人生 > >mapreduce自定義分組、自定義分割槽、二次排序

mapreduce自定義分組、自定義分割槽、二次排序

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應為分割槽,分組的條件,這時候就需要自定義分割槽和分組了