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

标签 java hadoop

如何基于键名设置输出文件?

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

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

使用Hadoop 0.20.205.0

(还可以有人给我指出这个Hadoop版本的一些很好的教程吗?)

最佳答案

this function中使用MultipleOutputs,在初始化作业时,您无需在任何地方预先指定文件名。

在 reducer 上使用它-

void write(K key, V value, String baseOutputPath);

baseOutputPath可以是键的字符串表示形式。

例如void write(K key, V value, getFileName(key))
getFileName(K key){
   return (key.toString());
}

请看一下链接中的示例,您将得到想法。

而且,您不需要使用reducer的context.write()。而是使用
仅MultipleOuputs的write()函数。

在我看来,这就是一切的动力,如果那是您想要的。

注意(注释后):

因为您说过不能使用MultipleOutputs,所以这实际上是另一种方法
那。
  • 由于reduce函数仅处理一个键,因此您无需使用context.write(key,value)即可​​使用Hadoop FileSystem api在HDFS中创建文件(使用键名)。

  • 就像是:
     FileSystem fs = file.getFileSystem(context.getConfiguration());
     FSDataOutputStream fileOut = fs.create(key.toString());
    
  • create()函数将返回FSDataOutputStream对象。使用write()函数写入文件。
  • 完成后关闭FileSystem对象。
    像-fs.close();
  • 关于java - 如何根据键名设置输出文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17983550/

    相关文章:

    java - Tomcat 不卸载 Web 应用程序

    java - Maven 代码覆盖率

    hadoop - 在托管模式下运行 Yarn

    java - HDFS Java API 检查权限

    hadoop - Hadoop ResourceManager不显示任何作业的记录

    java - 资源类和 null 参数

    java - Hibernate:将从查询检索到的所有值存储到ArrayList

    python - MapReduce在处理大文件,抓取大量数据页面并将其插入Hbase中有用吗?

    java - 正方形构建程序返回错误的措施

    hadoop - 当 rolloverSize 设置为 150 MB 时,每隔几秒就会刷新一次 Flume 消息