Spark按文件归档

时间:2018-03-06 02:23:04

标签: java apache-spark apache-spark-sql spark-dataframe

我想将RDD保存到按键分组的文本文件中,目前我无法弄清楚如何将输出拆分为多个文件,似乎跨越多个共享同一分区的键的所有输出都写入了同一个文件。我希望每个密钥都有不同的文件。这是我的代码片段:

JavaPairRDD<String, Iterable<Customer>> groupedResults = customerCityPairRDD.groupByKey();

groupedResults.flatMap(x -> x._2().iterator())
              .saveAsTextFile(outputPath + "/cityCounts");

2 个答案:

答案 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