0

通过映射器,我制作了多个键,然后将它们传递给减速器以执行某些功能。有没有办法一次将多个密钥发送到同一个减速器?实际上,我一次需要与单个减速器中的键关联的值。提前致谢!

4

1 回答 1

2

如果您想要的只是将多个键分区到同一个 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 YearPartitioneras 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

于 2014-06-15T07:16:53.617 回答