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

Java saveAsTextFile()将最终RDD作为单个文本文件写入-Apache Spark,java,apache-spark,Java,Apache Spark,我正在使用ApacheSpark开发一个批处理应用程序,我想以文本文件的形式编写最终的RDD,目前我正在使用RDD中可用的saveAsTextFile(“filePath”)方法 我的文本文件包含用\u0001分隔符分隔的字段。因此,在model类toString()方法中,我添加了所有用\u0001分隔符分隔的字段 这是正确的处理方法吗?或者其他最好的方法 另外,如果我迭代RDD并使用Java中可用的FileWriter类编写文件内容会怎么样 请就此提出建议 问候,, Shankar要作为单个

我正在使用ApacheSpark开发一个批处理应用程序,我想以文本文件的形式编写最终的RDD,目前我正在使用RDD中可用的
saveAsTextFile(“filePath”)
方法

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

这是正确的处理方法吗?或者其他最好的方法

另外,如果我迭代RDD并使用Java中可用的
FileWriter
类编写文件内容会怎么样

请就此提出建议

问候,,
Shankar

要作为单个文件写入,有几个选项。如果您要写入HDFS或类似的分布式存储,您可以首先将RDD合并到单个分区(注意,您的数据必须适合单个工作区),或者您可以将数据收集到驱动程序,然后使用filewriter

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系统。分两步实现:

  • 通过saveAsTextFile保存RDD,这将在文件夹中生成多个文件

  • 运行Hadoop“copyMerge”


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

    谢谢。Is saveAsTextFile()选项在内部使用Java FileWriter()或其他方法。不建议使用coalesce将数据带回驱动程序,而应使用coalesce。coalesce具有将所有数据带回一台计算机的相同效果。