Java Mapreduce group by compositekey 并排序

Java Mapreduce group by compositekey and sort

我有一个 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 |
+------------+----------+

我怎样才能做到这一点?在我 SQL 的想法中,组合键将是两列,一列用于城市,一列用于水果。我会按水果分组,排序,然后抓取计数最高的那一行。我无法弄清楚这如何转化为 mapreduce 世界。如有任何建议,我们将不胜感激!

进程

  1. 将您的数据读入新的 map reduce 作业
  2. 将您的信息拆分为城市作为键和复合值 fruit:count
  3. 在 reduce 阶段,您拥有手头城市的所有价值。现在您可以在一个循环中迭代所有这些值。将它们分开并记住最大的水果数量和水果。
  4. 现在将数据写入数据库或 HDFS

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