在处理《权威指南》中的第二个排序问题时,我遇到了如下代码:
@Override
public int getPartition(TextpairWritable tp, IntWritable value, int numPartitions) {
return Math.abs(Integer.parseInt(tp.getyear().toString()) * 127) % numPartitions;
}
我想了解线条的含义:
return Math.abs(Integer.parseInt(tp.getyear().toString()) * 127) % numPartitions;
如果我不告诉驱动程序代码中缩减器的数量,那么hadoop如何知道上面一行中这个参数的值呢。把它乘以127有什么意义?
1条答案
按热度按时间vwhgwdsa1#
return math.abs(integer.parseint(tp.getyear().tostring())*127)%numpartitions;
你可以把它看作是散列,基于你的
key's year
属性值。你可以选择任何(素数)与你得到的值相乘。这里选择的值是127
. 最后一部分,numPartitions
定义需要将数据划分为多少个存储桶(减速器)。如果我不告诉驱动程序代码中缩减器的数量,那么hadoop如何知道上面一行中这个参数的值呢。
参数的默认值为
1
. 所以所有的数据(Map器的输出)都被放到同一个reducer任务中。把它乘以127有什么意义?
它是一个素数。我们通常用素数相乘,这样你就可以处理/忽略数据的显示。素数不能被任何其他数整除,因此它们有助于在整个范围内均匀分布数据。