Java Mapreduce按组合键和排序分组

Java Mapreduce按组合键和排序分组,java,hadoop,mapreduce,hadoop2,composite-key,Java,Hadoop,Mapreduce,Hadoop2,Composite Key,我有一个mapreduce作业,它执行一些处理并生成city:fruit的复合键(实现WritableComparable)和相关计数。现在,我想将它与第二个mapreduce作业联系起来,该作业确定每种水果类型计数最高的城市 mapreduce作业1的组合键输出示例: +---------------------+-------+ | city:fruit composite| count | +---------------------+-------+ | london:apples

我有一个mapreduce作业,它执行一些处理并生成city:fruit的复合键(实现WritableComparable)和相关计数。现在,我想将它与第二个mapreduce作业联系起来,该作业确定每种水果类型计数最高的城市

mapreduce作业1的组合键输出示例:

+---------------------+-------+
| city:fruit composite| count |
+---------------------+-------+
| london:apples       | 3     |
+---------------------+-------+
| london:bannanas     | 2     |
+---------------------+-------+
| london:oranges      | 15    |
+---------------------+-------+
| charleston:apples   | 20    |
+---------------------+-------+
| charleston:bannanas | 1     |
+---------------------+-------+
| charleston:oranges  | 3     |
+---------------------+-------+
| chicago:bannanas    | 17    |
+---------------------+-------+
| chicago:apples      | 5     |
+---------------------+-------+
| chicago:oranges     | 11    |
+---------------------+-------+
作业2的期望输出:

+------------+----------+
| city       | fruit    |
+------------+----------+
| london     | oranges  |
+------------+----------+
| charleston | apples   |
+------------+----------+
| chicago    | bannanas |
+------------+----------+

我怎样才能做到这一点?在我看来,复合键应该是两列,一列表示城市,一列表示水果。我会按水果分组,分类,然后抓住计数最高的那一排。我不知道这是如何转化为mapreduce世界的。任何建议都将不胜感激

过程

  • 将数据读入新的map reduce作业
  • 将您的信息拆分为关键城市和水果的复合值:count
  • 在减少阶段,你手头上有一个城市的所有价值。现在可以在循环中迭代所有这些值。把它们分开,记住最大的水果数和水果数
  • 现在将数据写入数据库或HDFS

  • 请注意,每个减速器都会写入一个单独的文件。之后,您可以使用HDFS功能轻松地合并它们。也有可能只有一个减速器,但是我不喜欢这种方式,因为它不可伸缩。

    这完全正确,谢谢!有没有一种方法可以在fuit:count组合发送到reducer之前对其进行排序?是的,但这需要编写更多的内容。请问一个新问题,如果你在这里提供链接,我会尝试回答。但是给你一个提示,SecondaryOrdering是你想要搜索的关键字。这不会在映射阶段进行排序,但在reduce阶段之前,我对二次排序/排序进行了一些研究,但似乎找不到关注复合值的材料。我发布了一个新问题: