我想就Partitioner与MultipleOutputs提出您的意见。
假设我有一个文件,其中包含密钥

0:aaa
1:bbb
0:ccc
0:ddd
...
1:zzz

我想要2个文件:一个文件包含以0:开头的键,另一个文件包含以1:开头的键。我应该使用哪种方法:
1)使用自定义分区程序,它将解析键并为getPartition()返回0或1。
2)在归约阶段,通过解析键并为MultipleOutputs.write的zero参数提供onenamedOutput,使用MultipleOutputs.write

哪一个更好?对我来说,1)更好,因为reduces处理单个文件。

最佳答案

如果您的工作只是将输入文件分为两部分,那么MultipleOutputs是一个更好的选择,因为您可以保存在shuffle / sort阶段(通过运行仅映射作业)。

现在,如果您有很多输入文件,并且不希望输入的文件数量是输入文件的2倍,那么使用基于分区的方法将允许您将输入文件合并为2个输出(但是它们的名字不会很好用) ,这是MultipleOutputs的另一个好处,但是您可以通过在reducer和LaxyOutputFormat中使用MultipleOutputs来确保不将空的part-r文件写入输出中,从而轻松解决此问题。

因此,答案-这取决于您拥有多少个输入文件,以及想要多少个输出文件。

10-08 10:56