1. 程式人生 > >MapReduce 統計手機使用者的上行流量,下行流量,總流量,並對輸出的結果進行倒序排序。(二),劃分省份,輸出到不同的檔案

MapReduce 統計手機使用者的上行流量,下行流量,總流量,並對輸出的結果進行倒序排序。(二),劃分省份,輸出到不同的檔案

在(一)的基礎上,寫一個自己的partitioner就好了。

 

分割槽的預設實現HashPartitioner,它根據key的hashcode和Interger.

 在Reduce過程中,可以根據實際需求(比如按某個維度進行歸檔,類似於資料庫的分組),把Map完的資料Reduce到不同的檔案中。分割槽的設定需要與ReduceTaskNum配合使用。比如想要得到5個分割槽的資料結果。那麼就得設定5個ReduceTask。

 

在進行MapReduce計算時,有時候需要把最終的輸出資料分到不同的檔案中,按照手機號碼段劃分的話,需要把同一手機號碼段的資料放到一個檔案中;按照省份劃分的話,需要把同一省份的資料放到一個檔案中;按照性別劃分的話,需要把同一性別的資料放到一個檔案中。我們知道最終的輸出資料是來自於Reducer任務。那麼,如果要得到多個檔案,意味著有同樣數量的Reducer任務在執行。Reducer任務的資料來自於Mapper任務,也就說Mapper任務要劃分資料,對於不同的資料分配給不同的Reducer任務執行。Mapper任務劃分資料的過程就稱作Partition。負責實現劃分資料的類稱作Partitioner。

我們這裡設定了四個數字,所以在後面設定的時候,要設定4個。

 

code:

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

/**
 * @Decription: 通過號碼某個部分數字的區分,輸出到不同的檔案
 */
import java.util.HashMap;

public class ProvincePartitioner extends Partitioner<FlowBean, Text> {
    //HashMap 集合
    public  static HashMap<String, Integer> provinceMap  = new HashMap<String, Integer>();
    static {
        provinceMap.put("3", 0);
        provinceMap.put("4", 1);
        provinceMap.put("5", 2);
        provinceMap.put("8", 3);
    }
    public  int getPartition (FlowBean key, Text value,int numPartitions) throws IndexOutOfBoundsException {
            String st = value.toString().substring(1, 2);
            int num = provinceMap.get(st);
            return num;
    }
}

HashMap put方法

 

Partitoner原始碼