saveAsTextFile()将最终的RDD写为单个文本文件--Apache Spark

时间:2015-06-30 18:28:07

标签: java apache-spark

我正在使用Apache Spark处理批处理应用程序,我想将最终的RDD写为文本文件,目前我正在使用RDD中提供的saveAsTextFile("filePath")方法。

我的文本文件包含用\u0001分隔符分隔的字段。所以在模型类toString()方法中,我添加了所有用\u0001分隔符分隔的字段。

这是处理此问题的正确方法吗?或任何其他最佳方法?

如果我使用Java中提供的FileWriter类迭代RDD并编写文件内容,该怎么办?

请就此提出建议。

此致 香卡

3 个答案:

答案 0 :(得分:3)

要写为单个文件,有几个选项。如果您写入HDFS或类似的分布式商店,您可以先将coalesce您的RDD下载到一个分区(注意您的数据必须适合单个工作人员),或者您可以collect将数据添加到单个分区驱动程序然后使用文件编写器。

答案 1 :(得分:0)

public static boolean copyMerge(SparkConf sparkConf, JavaRDD rdd, String dstPath) throws IOException, URISyntaxException {
    Configuration hadoopConf = sparkConf.hadoopConfiguration();
    hadoopConf.set("fs.s3.awsAccessKeyId", awsAccessKey);
    hadoopConf.set("fs.s3.awsSecretAccessKey", awsSecretKey);
    String tempFolder = "s3://bucket/folder";
    rdd.saveAsTextFile(tempFolder);
    FileSystem hdfs = FileSystem.get(new URI(tempFolder), hadoopConfig);
    return FileUtil.copyMerge(hdfs, new Path(tempFolder), hdfs, new Path(dstPath), false, hadoopConfig, null);
}

此解决方案适用于S3或任何HDFS系统。分两步完成:

  1. 通过saveAsTextFile保存RDD,这会在文件夹中生成多个文件。

  2. 运行Hadoop" copyMerge"。

答案 2 :(得分:0)

而不是收集并将其收集到驱动程序,我宁愿建议使用合并,这将有助于减少内存问题