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