javamapreduce排序复合值

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

我有一个Map器,它发出一个文本(水果名)键和一个自定义复合值city:count. 我想在复合值到达reducer之前按计数对其进行排序,以便reducer可以快速确定哪个城市的计数最高。
复合值类是writeablecomparable的扩展,具有检索计数和城市的方法。
我的减速机当前接收的内容:

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>

从逻辑上讲,我该如何做到这一点?我读过几篇关于二次排序/排序的文章,但它们倾向于关注复合键,而不是复合值。我的密钥不需要进一步的分区,也不需要进一步的排序。
同样,按复合值排序不是复合键!

holgip5t

holgip5t1#

如果你的目标只是快速确定水果的最高含量,我想推荐另一种方法。因为在大多数情况下,排序的复杂性 O(n log n) 而找到最大的入口 O(n) 哪里 n 是您案例中的城市数。
1内存Map器
您可以在每个Map器中使用hashmap来确定每个Map器中每个水果的最大数量。以水果为钥匙,以城市+为价值。当你得到一个水果时,看看Map上比较大的那个。如果水果还不存在,你显然得把它放好。当执行所有Map步骤时,框架将调用Map器的cleanup方法。在清理中,可以发射贴图的条目。这将大大减少必须在reducer中发送和通过的值的数量。
2合路器
方法1。有一个明显的退步。如果你有大量的水果没有放入内存,它是不可伸缩的。如果是这种情况,您可以使用在Map器端执行的组合器。它的工作原理类似于缩小由相应Map器给出的较小数据集。这还可以减少发送给reducer的值的数量。
三。二次订购
你可以通过二次订购来完成。我真的很想鼓励你阅读普雷蒂库拉纳提供的文章。尤其是苏达珊的回答。给您一个简单的想法:使用fruit:count and 价值city:count. 请注意,您需要一个基于密钥的第一部分的特殊分区。我认为这将是一个很大的努力,但在某些情况下,这是有用的和必要的。

相关问题