gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:11:47 26 4
gpt4 key购买 nike

我目前有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com