我遇到了一个帖子,询问如何获得mapreduce正在处理的文件名。这让我想知道在什么情况下我们需要知道正在处理的文件的名称或路径。
FileSplit fileSplit = (FileSplit) context.getInputSplit();
String fileName = fileSplit.getPath().getName();
谢谢basam
在一些情况下文件名很重要,例如:
- 文件名中的时间戳在进程中是必需的
- 根据文件名的不同,你可以处理不同的文件。比如,如果你有两个非常相似的文件类型,需要一个相似的进程,但差异很小(如果不是,可能最好有两个不同的mapreduce作业)。
- 当您想要跟踪进程所处理文件的名称时。 等
有趣的问题。
假设您需要基于mapper id高效地生成唯一整数,就像这里所做的那样:
或者您可能有一个完全不同的理由使用映射器id(由context.getTaskAttemptID().getTaskID().getId()返回)
映射器任务id的问题是,它不是基于输入文件确定地分配的。
例如,您的映射器输入文件可能是前面的reducer的结果,并且假设您有10个输入分区:
输出- r - 00000输出- r - 00001…输出- r - 00009
现在需要将该数据提供给映射器,并且可能需要该映射器具有直接对应于输入文件索引的id。
通常,在这种情况下,您要做的第一件事是禁用输入分割,以便每个映射器完全处理自己的分区。
但是正如我之前所说的映射器不是确定地分配的,所以你不能依赖context. gettasattemptid ().getTaskID().getId():
有时mapper 0会处理output-r-00000,有时会处理output-r-00001,等等。
因此,为了确定自定义映射器id,您可以使用输入文件名,您可以解析该文件名以获得分区索引