如何根据键名设置输出文件?
例如,以 mapreduce 中流行的 WordCount 示例为例。如果我给它一个具有正确语法的任意文件,它应该会找到键(单词)及其出现的频率。如何获得每个键是文件名并且文件内部是值的输出?
(我问是因为我目前的理解是 MultipleOutputs 仍然需要指定要使用的特定文件名)
使用 hadoop 0.20.205.0
(也有人可以为我指出这个 hadoop 版本的一些好的教程吗?)
如果您想根据不同的键将值写入多个文件,只需使用键(String
我想是 s)来构造文件名并以通常的方式创建文件,例如使用FileWriter。
使用MultipleOutputs中的此功能,您无需在初始化作业时在任何地方预先指定文件名。
从减速器中使用它 -
void write(K key, V value, String baseOutputPath);
baseOutputPath 可以是您的密钥的字符串表示形式。
例如 void write(K key, V value, getFileName(key))
getFileName(K key){
return (key.toString());
}
请查看链接中的示例,您会明白的。
此外,您不需要使用context.write()
减速器。而是write()
仅使用 MultipleOutputs 函数。
在我看来,如果这就是你想要的,这会使一切变得动态。
注意(评论后):
因为,你说你不能使用 MultipleOutputs,这是你可以实际使用的另一种方式。
就像是:
FileSystem fs = file.getFileSystem(context.getConfiguration());
FSDataOutputStream fileOut = fs.create(key.toString());
create()函数会返回一个 FSDataOutputStream 对象。使用 write() 函数写入文件。
完成后关闭 FileSystem 对象。就像是 -fs.close();