Reducer可以同时拥有多个键吗?



通过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

相关内容

  • 没有找到相关文章