我编写了一个MapReduce代码,其中键和值都是整数。我正在使用单个Reducer。输出是这样的:
Key Value
1 78
128 12
174 26
2 44
2957 123
975 91
是否有一种方法可以按键按升序对输出进行排序?这样输出看起来像这样:
1 78
2 44
128 12
174 26
975 91
2957 123
我需要使用conf.setComparator
吗?如果是,我该怎么做?
答案 0 :(得分:8)
这需要
TotalOrderPartitioner
在M / R管道中强制执行一个额外的阶段,将元素划分为已分类的存储桶。
TreeMap解决方案不会全局工作,只能在每个Reducer中使用。
以下是显示如何使用TotalOrderPartioner的要点(不是我的):https://gist.github.com/asimjalis/e5627dc2ff2b23dac70b
要点的关键要点是:
a)你需要调用reducer.setPartitionerClass到TotalOrderPartitioner:
// Use Total Order Partitioner.
reduceJob.setPartitionerClass(TotalOrderPartitioner.class);
b)您需要生成一组拆分以用作"桶"对于TOP
// Generate partition file from map-only job's output.
TotalOrderPartitioner.setPartitionFile(
reduceJob.getConfiguration(), partitionPath);
InputSampler.writePartitionFile(reduceJob, new InputSampler.RandomSampler(
1, 10000));
答案 1 :(得分:4)
我在这里看到三个选项:
(并且首选)使用the answer of javadba(来自我的+1)。这更通用,但需要更多努力。
如果可以,只需使用一个减速机。这要求所有数据都可以放入单个机器的内存中。然后,单个减速器的输入将按键的升序排序(您想要的)。
作业完成后,您可以使用hdfs的getmerge
命令,然后手动对合并文件进行排序,例如,使用the sort
command of Linux(甚至对多个文件进行合并排序,没有getmerge
命令。毕竟,你不必为所有事情使用MapReduce!
小心只根据键进行排序!例如,您可以运行:
sort -n -k1,1 filename
但是还有更多的排序选项......
作为最后的注释(完成)以上所有假设您不使用仅映射作业,其中输出未排序。如果是这样,我只能看到选项3工作。
更新:为了将来参考并根据评论,输出键似乎不是IntWritable
类型,因此它们没有按整数排序。
答案 2 :(得分:0)
使用TreeMap
。它是为此而创建的:
基于红黑树的NavigableMap实现。 地图根据其键的自然顺序进行排序,或者在地图创建时提供的比较器进行排序,具体取决于使用的构造函数。