package hadoop;
/**
* @ClassName HadoopUtils
* @Description Hadoop中的Partitioner类的讲解说明
* @Author Administrator
* @Date 2019/7/10 10:36
* @Version 1.0
**/
public class HadoopUtils {
/**
* 计算当前月份+星期得到的索引应该分配到哪个reducers节点上
* @param month 月份
* @param dayOfWeek 一周中的哪天
* @param indexRange 索引的范围
* @param noOfReducers reducers的数量
*/
public static int getPartition(int month, int dayOfWeek, int indexRange, int noOfReducers) {
int indicesPerReducer = (int) Math.floor(indexRange / noOfReducers);//Math.floor(11.5)=11
int index = (month - 1) * 7 + (7 - dayOfWeek);
/**
* 索引的范围小于reducers的数量
*/
if (indexRange < noOfReducers) {
return index;
}
/**
* 计算当前月份+星期得到的索引应该分配到哪个reducers节点上
*/
for (int i = 0; i < noOfReducers; i++) {
int minValForPartitionInclusive = (i) * indicesPerReducer;
int maxValForPartitionExclusive = (i + 1) * indicesPerReducer;
if (index >= minValForPartitionInclusive && index < maxValForPartitionExclusive) {
return i;
}
}
}
}