2016-06-17 31 views
2

我有发出文本(水果名)键和一个自定义的复合值城市映射器:计数。我想在复合值到达减速器之前通过计数对复合值进行排序,以便减速器可以快速确定哪个城市的计数最高。Java的MapReduce的排序组合值

的复合值类是WritableComparable的延伸,并且具有用于检索计数和城市方法。

什么我减速当前接受:

reducer 1 - oranges:<london:2, chicago:15, charleston:6> 
reducer 2 - apples:<charleston:31, london:3, chicago:29> 
... 

我希望我的减速器收到什么:

reducer 1 - oranges:<chicago:15, charleston:6, london:2> 
reducer 2 - apples:<charleston:31, chicago:29, london:3> 

从逻辑上讲,我怎么做到这一点?我读过几篇有关Secondary Sorting/Ordering的文章,但他们倾向于关注复合键而不是复合值。我的密钥不需要进一步分区,也不需要进一步分类。

此外,通过复合VALUE不是复合键排序!

+0

的可能的复制[hadoop的地图减少二次分选(http://stackoverflow.com/questions/18395998/hadoop-map-reduce-secondary-sorting) –

回答

1

如果只瞄准快速测定水果的最高金额的我想推荐的另一种方法。因为在大多数情况下,分拣拥有的O(n log n)复杂性,同时发现最大的条目只有O(n)其中n你的情况的城市数量。

1.映射器,内存

您可以使用HashMap中的每个映射器,以确定每个映射每个水果的最高金额。只需使用水果作为关键和城市+计数作为价值。当你看到地图上的水果,比较大的时候。如果水果不存在,你显然必须设置它。 当所有的地图步骤都被执行时,框架会调用你的映射器的清理方法。在清理中,您可以发出地图的条目。这将减少你必须在减速器中显着发送和通过的值的数量。

2.合

的方法1.有一个显著退。如果你有大量的水果不适合记忆,它是不可扩展的。如果是这种情况,您可以使用在映射器端执行的组合器。它对于相应的映射器给出的一组较小的数据就像一个简化器一样工作。这也可以减少发送给减速器的数量。

3.二次订货

你可以用二次订货做到这一点。我真的很想鼓励你阅读Preeti Khurana提供的文章。特别是answer of Sudarshan。给你一个简要的想法:使用水果的复合关键:count和city:count的值。请注意,您需要基于密钥的第一部分进行特殊分区。我认为这将是一个很大的努力,但在某些情况下,这是有用的和必要的。