reducer可以一次拥有多个键吗?

waxmsbnn  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(395)

通过mapper,我制作了多个键,然后将它们传递给reducer来执行一些功能。有没有办法一次把多把钥匙送到同一个减速机上?实际上,我一次需要与单个reducer中的键关联的值。提前谢谢!

rryofs0p

rryofs0p1#

如果您只想将多个键划分到同一个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和degree作为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年的数据将全部发送到同一个减速机,并定制 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

相关问题