使用不同参数读取文件两次

时间:2016-06-30 15:01:27

标签: hadoop parameters mapreduce

我知道如果使用相同的路径键入addinputpath函数两次,可以生成同一文件的两个映射器,但我希望每次处理的文件略有不同。

具体来说,我希望每次都使用我通过Job类传递的不同参数(使用configuration.set / get)。当文件不同时,我通过使用context / inputsplit类来获取文件的路径/名称来实现,但现在它们是相同的,我无法区分它们。有什么想法吗?

每个映射器都是一个不同的maptask,但我不知道我是否可以使用有关maptasks的任何信息。此外,我不知道框架将输入匹配与maptasks匹配的顺序 - 它可能很有用。

或者我可以复制文件(使用不同的名称),但这会浪费资源

2 个答案:

答案 0 :(得分:0)

我建议你把这个逻辑放到你的Mapper中。它比使用Hadoop扫描和处理同一文件两次更有效。

所以伪代码就是这样:

map(key, value, context) {

  //do something with this key/value
  ...
  //emit output 1
  context.write(...)

  //do something else with this the same key/value
  ...
  //emit output 2
  context.write(...)
}

如果您需要将输出1和2分派到不同的Reducer,则需要制作输出键才能执行此操作。

答案 1 :(得分:0)

为了方便起见,我不得不覆盖inputsplit和inputformat类(fileinputformat和filesplit)。

我在filesplit中添加了额外的字段,以区分读取分割的时间。它工作得很好