从 rdd 创建数据集时,spark 是否使用已定义的分区

问题描述 投票:0回答:1

鉴于以下 rdd 按人的年龄分区,我创建一个数据集,我想为其输出 parquet 也按年龄分区:

    val rdd = spark.sparkContext.parallelize(
      Seq(Person(11, "John Doe"), Person(22, "Jane Doe"), Person(33, "Foo Bar"))
    )
    val rddPartitionedByAge = rdd.keyBy(_.age).partitionBy(new ByAgePartitioner)

    //create dataset from an already partitioned RDD
    import spark.implicits._
    val partitionedDataset = spark.createDataset(rddPartitionedByAge.values)
    partitionedDataset
      .write
      .mode("overwrite")
      .partitionBy("age")  //does spark re-shuffle the data here ? 
      .parquet("./output/datasetFromRdd")
  1. spark知道底层rdd的分区吗?
  2. 按年龄分区写入 parquet 时,spark 是否会重新洗牌数据?
apache-spark
1个回答
0
投票

由于我正在度假,凭记忆回答:

  1. 是的。如果设置了 no-repartition,则必须使用与 DS 创建时相同的分区。顺便说一句,这不是 createDataset api 的参数。
  2. 是的。尽管我们明白你的意思,但还是有明确的 api 指令。检查 Spark UI 的随机播放 - 读取和写入。
© www.soinside.com 2019 - 2024. All rights reserved.