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

时间:2013-08-01 00:58:32

标签: java hadoop

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

例如,在mapreduce中使用流行的WordCount示例。如果我用正确的语法给它一个任意文件,它应该找到键(单词)和它们出现的频率。如何得到一个输出,其中每个键是文件名,文件内部是值?

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

使用hadoop 0.20.205.0

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

2 个答案:

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

  1. 由于reduce函数只处理一个键,而不是执行context.write(key,value),您可以使用Hadoop FileSystem api在HDFS中创建一个文件(带有您的密钥名称)。
  2. 类似的东西:

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

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

    3. 之类的东西