在Apache Spark中指定输出文件名

时间:2014-08-13 18:51:47

标签: python apache-spark

我正在尝试迁移到PySpark的MapReduce作业。有没有办法定义输出文件的名称,而不是获取part-xxxxx

在MR中,我使用org.apache.hadoop.mapred.lib.MultipleTextOutputFormat类来实现这一目标,

PS:我确实尝试过saveAsTextFile()方法。例如:

lines = sc.textFile(filesToProcessStr)
counts = lines.flatMap(lambda x: re.split('[\s&]', x.strip()))\
.saveAsTextFile("/user/itsjeevs/mymr-output")

这将创建相同的part-0000文件。

[13:46:25] [spark] $ hadoop fs -ls /user/itsjeevs/mymr-output/
Found 3 items
-rw-r-----   2 itsjeevs itsjeevs          0 2014-08-13 13:46 /user/itsjeevs/mymr-output/_SUCCESS
-rw-r--r--   2 itsjeevs itsjeevs  101819636 2014-08-13 13:46 /user/itsjeevs/mymr-output/part-00000
-rw-r--r--   2 itsjeevs itsjeevs   17682682 2014-08-13 13:46 /user/itsjeevs/mymr-output/part-00001

修改

最近阅读了the article,这将使Spark用户的生活更轻松。

2 个答案:

答案 0 :(得分:4)

Spark也在使用Hadoop,所以你可以得到你想要的东西。这就是saveAsTextFile的实施方式:

def saveAsTextFile(path: String) {
  this.map(x => (NullWritable.get(), new Text(x.toString)))
    .saveAsHadoopFile[TextOutputFormat[NullWritable, Text]](path)
}

您可以将自定义的OutputFormat传递给saveAsHadoopFile。我不知道如何从Python做到这一点。抱歉,答案不完整。

答案 1 :(得分:0)

您的输出文件将如下所示;

myfilename-r-00000 myfilename-r-00001

        SparkConf sparkConf = new SparkConf().setAppName("WCSYNC-FileCompressor-ClusterSaver");
        SparkContext sc = new SparkContext(sparkConf);
            JavaSparkContext context = new JavaSparkContext(sc)
context.hadoopConfiguration().set("mapreduce.output.basename", "myfilename");




saveAsNewAPIHadoopFile(outputpath,
                                Text.class,
                                Text.class,
                                TextOutputFormat.class,
                                context.hadoopConfiguration());