通过映射器,我制作了多个键,然后将它们传递给减速器以执行某些功能。有没有办法一次将多个密钥发送到同一个减速器?实际上,我一次需要与单个减速器中的键关联的值。提前致谢!
1 回答
如果您想要的只是将多个键分区到同一个 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]
如果您想将年份和学位作为映射输出的组合键,并且只将不同年份的键分区到不同的减速器,您只需实现YearPartitioner
:
public static class YearPartitioner extends Partitioner<CombineKey, V> {
int getPartition(CombineKey k, V value, int numPartitions) {
return k.getyear % numPartitions;
}
}
和 Set YearPartitioner
as 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