我知道,如果使用相同的路径两次键入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中添加了一个额外的字段来区分读取分割的时间。效果很好