java - 如何使用 MultipleOutputs 类在 Hadoop 中输出具有特定扩展名(如 .csv)的文件

标签 java file hadoop mapreduce

我目前有一个 MapReduce 程序,它使用 MultipleOutputs 将结果输出到多个文件中。 reducer 看起来像这样:

private MultipleOutputs mo = new MultipleOutputs<NullWritable, Text>(context);
...
public void reduce(Edge keys, Iterable<NullWritable> values, Context context)
            throws IOException, InterruptedException {
        String date = records.formatDate(millis);
        out.set(keys.get(0) + "\t" + keys.get(1));
        parser.parse(key); 
        String filePath = String.format("%s/part", parser.getFileID());
        mo.write(noval, out, filePath);
    }

这与 Hadoop:权威指南 一书中的示例非常相似 - 但是,问题在于它将文件输出为纯文本。我希望将我的文件输出为 .csv 文件,但未能在书中或在线找到相关解释。

如何做到这一点?

最佳答案

您是否尝试在驱动程序中的 Job 对象完成后遍历输出文件夹以重命名文件?

只要您在 reducer 中发出(文本应该是 csv 中的行,值由分号分隔或您需要的任何内容),您可以尝试这样的事情:

Job job = new Job(getConf());
//...
//your job setup, including the output config 
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
//...
boolean success = job.waitForCompletion(true);
if (success){
    FileSystem hdfs = FileSystem.get(getConf());
    FileStatus fs[] = hdfs.listStatus(new Path(outputPath));
    if (fs != null){ 
        for (FileStatus aFile : fs) {
            if (!aFile.isDir()) {
                hdfs.rename(aFile.getPath(), new Path(aFile.getPath().toString()+".csv"));
            }
        }
    }
}

关于java - 如何使用 MultipleOutputs 类在 Hadoop 中输出具有特定扩展名(如 .csv)的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779231/

相关文章:

java - 使用 Java 在单个语句中运行多个 Hive 查询时出错

java - JBoss错误报告: HTTP Status 404 - Servlet is not available

c++ - 在 C++ 中通过 HTTP POST 上传文件

c - C语言回合制聊天程序

file - 如何在 Informix 中打开和读取文件

hadoop - 查看计数行作为查询结果中的列

java - 将 ssl 处理从 Tomcat 转移到 Apache?

java - Maven testCompile 适用于 Java 9 Build 166,但适用于 Build 167 失败

java - 套接字中的 Swing 代码

hadoop - 为 Lustre 配置 Hadoop 时无法启动名称节点