【问题标题】:Can Reducer have multiple keys at a single time?Reducer 一次可以有多个键吗?
【发布时间】:2014-08-05 01:20:42
【问题描述】:

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

【问题讨论】:

  • 贴一些代码,让你更清楚。

标签: hadoop mapreduce mapper reducers


【解决方案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]

如果你想将年份和学位作为映射输出的组合键,并且只将不同年份的键分区到不同的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()首先被&lt;1990,35&gt;调用为key,&lt;&lt;A1 A2 A3 A4&gt;&gt;为值列表,并再次被 &lt;1990, 34&gt; 作为键调用,&lt;&lt;B1 B2 B3 B4&gt;,&lt;C2 C2 C3 C4&gt;&gt; 作为值列表调用。

如果您想更进一步,将reduce 称为&lt;1990,x&gt; 作为键,&lt;&lt;A1 A2 A3 A4&gt;,&lt;B1 B2 B3 B4&gt;,&lt;C2 C2 C3 C4&gt;&gt; 作为值列表,请实现一个 keyComparator 并将其设置为GroupingComparatorClass

【讨论】:

  • 非常感谢您的帮助:)
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2019-11-12
  • 2012-12-17
  • 2017-05-11
相关资源
最近更新 更多