0

如何根据键名设置输出文件?

例如,以 mapreduce 中流行的 WordCount 示例为例。如果我给它一个具有正确语法的任意文件,它应该会找到键(单词)及其出现的频率。如何获得每个键是文件名并且文件内部是值的输出?

(我问是因为我目前的理解是 MultipleOutputs 仍然需要指定要使用的特定文件名)

使用 hadoop 0.20.205.0

(也有人可以为我指出这个 hadoop 版本的一些好的教程吗?)

4

2 回答 2

0

如果您想根据不同的键将值写入多个文件,只需使用键(String我想是 s)来构造文件名并以通常的方式创建文件,例如使用FileWriter

于 2013-08-01T01:05:31.470 回答
0

使用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,这是你可以实际使用的另一种方式。

  1. 由于 reduce 函数只处理一个键,因此您可以使用 Hadoop FileSystem api在 HDFS 中创建一个文件(使用您的键名),而不是执行 context.write(key, value) 。

就像是:

 FileSystem fs = file.getFileSystem(context.getConfiguration());
 FSDataOutputStream fileOut = fs.create(key.toString());
  1. create()函数会返回一个 FSDataOutputStream 对象。使用 write() 函数写入文件。

  2. 完成后关闭 FileSystem 对象。就像是 -fs.close();

于 2013-08-01T04:50:34.533 回答