我知道如果使用相同的路径键入addinputpath函数两次,可以生成同一文件的两个映射器,但我希望每次处理的文件略有不同。
具体来说,我希望每次都使用我通过Job类传递的不同参数(使用configuration.set / get)。当文件不同时,我通过使用context / inputsplit类来获取文件的路径/名称来实现,但现在它们是相同的,我无法区分它们。有什么想法吗?
每个映射器都是一个不同的maptask,但我不知道我是否可以使用有关maptasks的任何信息。此外,我不知道框架将输入匹配与maptasks匹配的顺序 - 它可能很有用。
或者我可以复制文件(使用不同的名称),但这会浪费资源
答案 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中添加了额外的字段,以区分读取分割的时间。它工作得很好