【发布时间】:2014-08-05 01:20:42
【问题描述】:
通过映射器,我创建了多个键,然后将它们传递给 reducer 以执行某些功能。有没有办法一次将多个密钥发送到同一个减速器?实际上,我一次需要与单个减速器中的键关联的值。提前致谢!
【问题讨论】:
-
贴一些代码,让你更清楚。
标签: hadoop mapreduce mapper reducers
通过映射器,我创建了多个键,然后将它们传递给 reducer 以执行某些功能。有没有办法一次将多个密钥发送到同一个减速器?实际上,我一次需要与单个减速器中的键关联的值。提前致谢!
【问题讨论】:
标签: hadoop mapreduce mapper reducers
如果您只想将多个键分区到同一个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]
如果你想将年份和学位作为映射输出的组合键,并且只将不同年份的键分区到不同的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>调用为key,<<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
【讨论】: