Hadoop(和Java)在这里新手。我需要一些帮助,使用MultipleTextOutputFormat
来控制MapReduce中的输出文件名。
目前我正在使用它this way。它似乎工作正常。然而,我想要改变的是使用选择的字段来确定文件名。
而不是将它们硬编码到field[0]
或field[3]
(如示例中的情况),我想从JobConf
中选择(以某种动态方式)为field[jobConf.get("id.offset")]
或field[jobConf[get("date.offset")]
。这里有没有人知道如何做到这一点(或者这样做的东西,即它本身不一定是JobConf
)?
任何指针/建议/提示等。非常感谢。感谢。
答案 0 :(得分:2)
这取决于您的自定义参数是根据作业还是键/值对而不同。
如果覆盖getRecordWriter()方法,则可以获取JobConf对象。这是调用generateFileNameForKeyValue()的方法(在Hadoop源代码中查看MultipleOutputFormat类中的实现)。您可以调用super,然后使用您在JobConf对象中传递的参数执行任何操作。
如果您的参数因不同的键/值对而不同,您可以将参数作为键或值的一部分发送。然后覆盖MultipleTextOutputFormat类中的getActualKey()或getActualValue()以获取所需的实际键或值对象。
希望这有帮助。
答案 1 :(得分:0)
您可以向conf
对象添加设置。
Configuration conf = new Configuration();
conf.set("id.offset", 0);
conf.set("date.offset", 3);
...
JobConf jobConf = new JobConf(conf, MyJob.class);
在你的fileName函数中,你可以按照你的意愿使用它; field[jobConf.get("id.offset")]
和field[jobConf[get("date.offset")]
。
这里有一个小注:我没有使用JobConf,所以我实际上并不知道如何将设置拉出来。我使用Job,map
函数有context
对象,我将其用作context.getConfiguration()
来获取Configuration
对象conf
,并将数据作为int idOffset = conf.get("id.offset");
。
HTH