我想将RDD保存到按键分组的文本文件中,目前我无法弄清楚如何将输出拆分为多个文件,似乎跨越多个共享同一分区的键的所有输出都写入了同一个文件。我希望每个密钥都有不同的文件。这是我的代码片段:
JavaPairRDD<String, Iterable<Customer>> groupedResults = customerCityPairRDD.groupByKey();
groupedResults.flatMap(x -> x._2().iterator())
.saveAsTextFile(outputPath + "/cityCounts");
答案 0 :(得分:0)
这可以通过使用foreachPartition将每个分区保存到单独的文件中来实现。
您可以按照以下方式开发代码
groupedResults.foreachPartition(new VoidFunction<Iterator<Customer>>() {
@Override
public void call(Iterator<Customer> rec) throws Exception {
FSDataOutputStream fsoutputStream = null;
BufferedWriter writer = null;
try {
fsoutputStream = FileSystem.get(new Configuration()).create(new Path("path1"))
writer = new BufferedWriter(fsoutputStream)
while (rec.hasNext()) {
Customer cust = rec.next();
writer.write(cust)
}
} catch (Exception exp) {
exp.printStackTrace()
//Handle exception
}
finally {
// close writer.
}
}
});
希望这有帮助。
拉维
答案 1 :(得分:0)
所以我想到了如何解决这个问题。将RDD转换为Dataframe,然后在写入期间按键分区。
Dataset<Row> dataFrame = spark.createDataFrame(customerRDD, Customer.class);
dataFrame.write()
.partitionBy("city")
.text("cityCounts"); // write as text file at file path cityCounts