通过mapper,我制作了多个键,然后将它们传递给reducer来执行一些功能。是否有一种方法,我可以发送多个密钥一次到相同的减速器?实际上,我需要一次在单个减速器中与键相关联的值。提前感谢!
如果您想要的只是将多个键分区到同一个reducer,那么您只需编写一个定制的Partitioner
并为您想要分区的键生成相同的int。
由于您会意识到分区是不够的,并且您还希望一次向reduce(K k, Iterator<V>)
发送多个键,因此您可能还需要实现一个比较器,使多个键比较相等,并将比较器设置为job.setGroupingComparatorClass(GourpingClass.class)
。
作为Hadoop: The definitive Guide P279
的改编示例:
你的数据是这样的:
1990 35 A1 A2 A3 A4
1990 34 B1 B2 B3 B4
1990 34 C2 C2 C3 C4
1991 36 [other data here]
1991 35 [other data here]
如果你想让year &度作为map输出的组合键,并且只将不同年份的键划分到不同的reducer,您只需实现YearPartitioner
:
public static class YearPartitioner extends Partitioner<CombineKey, V> {
int getPartition(CombineKey k, V value, int numPartitions) {
return k.getyear % numPartitions;
}
}
并将YearPartitioner
设置为job.setPartitionerClass(YearPartitoner.class)
,通过这样做,您1990年的数据将全部发送到相同的reducer,并且您的自定义reduce()
将首先由<1990,35>
调用为键,<<A1 A2 A3 A4>>
作为值列表,然后再次由<1990, 34>
调用为键,<<B1 B2 B3 B4>,<C2 C2 C3 C4>>
作为值列表。
如果你想更进一步,让reduce
被称为<1990,x>
作为键,<<A1 A2 A3 A4>,<B1 B2 B3 B4>,<C2 C2 C3 C4>>
作为值列表,实现一个keyComparator &设置为GroupingComparatorClass