用不同的参数读取一个文件两次



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

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

每个mapper是一个不同的maptask,但我不知道我是否可以使用关于maptask的任何信息。我也不知道框架匹配inputsplit到maptasks的顺序-它可能是有用的。

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

我建议您将此逻辑放入您的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,则需要制作输出键来完成此任务。

我必须重写inputsplit和inputformat类(为方便起见,是fileinputformat和filesplit)。

我在filesplit中添加了一个额外的字段来区分读取分割的时间。效果很好

相关内容

  • 没有找到相关文章

最新更新