我遇到了一篇帖子,询问如何通过mapreduce处理文件名。这让我想知道在什么情况下我们需要知道正在处理的文件的名称或路径。
FileSplit fileSplit = (FileSplit) context.getInputSplit();
String fileName = fileSplit.getPath().getName();
由于 basam
答案 0 :(得分:1)
有几种情况,例如文件的名称很重要:
答案 1 :(得分:0)
有趣的问题。
假设你需要根据mapper id高效生成唯一的整数,就像在这里完成一样:Unique Key generation in Hive/Hadoop
或者你可能有完全不同的理由使用mapper id(由context.getTaskAttemptID()返回.getTaskID()。getId())
映射器任务ID的问题在于它未根据输入文件确定性地分配。
例如,您的映射器输入文件可能是前一个reducer的结果,并且说您有10个输入分区:
输出-R-00000 输出-R-00001 ... 输出-R-00009
现在您需要将此数据提供给映射器,并且可能需要此映射器具有直接对应于输入文件索引的ID。
通常,在这种情况下,您首先要做的是禁用输入拆分,这样每个映射器都会完全处理自己的分区。
但是正如我之前所说的那样,映射器没有确定性分配,所以你不能依赖context.getTaskAttemptID()。getTaskID()。getId():
有时映射器0将处理输出-r-00000,有时输出-r-00001,依此类推。
因此,为了确定性地提出自定义映射器ID,您可以使用输入文件名来解析分区索引。