当前位置: 首页 > 知识库问答 >
问题:

Java Mapreduce排序复合值

仲柏
2023-03-14

我有一个映射器,它发出一个文本(水果名称)键和一个自定义复合值city:count。我希望在复合值到达reducer之前,根据计数对其进行排序,以便reducer可以快速确定哪个城市的计数最高。

复合值类是WritableCompable的扩展,具有检索计数和城市的方法。

我的减速机目前收到的是:

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>

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

同样,按复合值而不是复合键排序!

共有1个答案

鲁景山
2023-03-14

如果你只是想快速确定水果的最高含量,我想推荐另一种方法。因为在大多数情况下,排序的复杂性为O(n log n),而查找最大的条目只有O(n)其中n是您的情况下的城市数量。

1. 带内存的映射器

您可以在每个映射器中使用哈希图来确定每个映射器中每个水果的最高数量。只需使用水果作为键,城市计数作为值。当您得到一个水果时,请查看地图以比较更大的水果。如果水果不存在,您显然必须设置它。当执行所有地图步骤时,框架会调用映射器的清理方法。在清理过程中,您可以发出地图的条目。这将大大减少您必须发送和在减速器中通过的值的数量。

2.组合器

方法1有一个明显的缺点。如果你有大量不适合内存的水果,它是不可扩展的。如果是这种情况,你可以使用一个在映射器端执行的组合器。它的工作方式就像一个由相应映射器给出的较小数据集的简化器。这也将导致你发送到简化器的值数量减少的好处。

3. 二次订购

你可以通过二次订购来做到这一点。我真的很想鼓励你阅读Preeti Khurana提供的文章。尤其是Sudarshan的回答。给你一个简短的想法:使用一个水果:计数和城市:计数的值的复合键。请注意,您需要一个基于键的第一部分的特殊分区。我认为这将是一个很高的工作量,但在某些情况下,这是有用和必要的。

 类似资料:
  • 我试图通过合并排序对数组进行排序,并在排序时删除我认为相等的元素。我递归调用合并排序,然后合并。 到了这一点,我发现a和c是重复的。 我根据特定的标准决定我想要哪一个,我选择c。我递增右手计数器和左手计数器,比较b和d。假设我选择d,然后我选择b。我希望我的最终列表只有元素 但是,发生的事情是在下一个递归调用中,和是0和3,因此d在下一次调用时在数组中列出两次。合并过程使用的数组是: 这是代码。提

  • 双向合并排序与递归合并排序有何不同? 假设在合并排序中有5个数字需要排序8,9,1,6,4,我们按如下步骤1进行划分:{8,9,1}{6,4} 步骤2:{8,9}{1}{6}{4} 步骤3:{8}{9}{1}{6}{4} 现在合并 步骤4:{8,9}{1}{4,6} 步骤5:{1,8,9}{4,6} 第六步:{1,4,6,8,9} 但在双向合并排序中,我们将数组分为两个元素(但根据维基百科,在合并

  • 本文向大家介绍合并排序,包括了合并排序的使用技巧和注意事项,需要的朋友参考一下 合并排序技术基于分而治之。我们将整个数据集分成较小的部分,然后按排序顺序将它们合并成较大的部分。在最坏情况下它也非常有效,因为该算法在最坏情况下的时间复杂度也较低。 合并排序技术的复杂性 时间复杂度: 所有情况下为O(n log n) 空间复杂度:  O(n) 输入输出 算法 合并(数组,左,中,右) 输入- 数据集数

  • 我们大量使用cassandra wide rows来存储每个用户的时间序列,因为它们非常适合那个用例。假设我们有一个表: 如果时间戳上的冲突可能发生(相同的用户可以用相同的时间戳发出两个不同的事件)。假设我们对所有事件都有一个顺序(每个事件都有一个序列int),那么调整这个模式来解决这个问题的最佳方法是什么。 我将无法执行-cassandra不允许这样做。

  • 问题内容: 我有一个Java集合: 现在在显示列表之前有一个字段,我想按此排序此集合。 有什么办法可以做到吗? 问题答案: 使用比较器: 此外,如果实现,则只需使用 使用JDK 8,语法要简单得多。 更简单 最简单的 显然,初始代码也可以用于JDK 8。

  • 问题内容: 我找不到使用此方法的任何示例,所有示例都给出了第二个参数“ null”。我听说此方法用于根据多个标准对类进行排序,但找不到示例。 对于本课程,如果我想根据学生的姓名和年龄对学生列表进行排序,如何使用方法Collections sort(List,Comparator) 问题答案: 在你现有的学生班级的基础上,这通常是我的工作方式,尤其是当我需要多个比较器时。 用法: 编辑 自Java