我正在使用Apache Spark处理批处理应用程序,我想将最终的RDD写为文本文件,目前我正在使用RDD中提供的saveAsTextFile("filePath")
方法。
我的文本文件包含用\u0001
分隔符分隔的字段。所以在模型类toString()方法中,我添加了所有用\u0001
分隔符分隔的字段。
这是处理此问题的正确方法吗?或任何其他最佳方法?
如果我使用Java中提供的FileWriter
类迭代RDD并编写文件内容,该怎么办?
请就此提出建议。
此致 香卡
答案 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系统。分两步完成:
通过saveAsTextFile保存RDD,这会在文件夹中生成多个文件。
运行Hadoop" copyMerge"。
答案 2 :(得分:0)
而不是收集并将其收集到驱动程序,我宁愿建议使用合并,这将有助于减少内存问题