您好我正在学习hadoop,我想要一个关于如何使用自定义分区来解决字数问题的例子。我希望将reducers设置为26,以便所有以“A”开头的字符将转到第一个reducer,所有字符“B”转到第二个reducer等等......
public class PersonPartitioner扩展了Partitioner {
@Override
public int getPartition(Text key, IntWritable Val, int numOfReducer) {
String line = key.toString();
String [] splits = line.trim().replaceAll("[0-9]", "").split("\\W+");
for(String str:splits){
if(null==str||str.trim().length()<1||""==str){
}else{String ch = str.substring(0, 1);
character.set(ch);
}
}
return Math.abs(character.charAt(0).hashCode()*127)%numOfReducer;
答案 0 :(得分:1)
因此,如果你正在进行单词计数,那么Text key
应该是一个单词(希望以a-z开头,因为你似乎并不关心数字)而不是整行。
其次,如果您知道此Partitioner
只会在有Reducers
的情况下使用,则可以执行此操作。
@Override
public int getPartition(Text key, IntWritable Val, int numOfReducer) {
String word = key.toString();
char char = word.toLowerCase().charAt(0);
return Charcter.getNumericValue(char) - Character.getNumericValue('a');
}