如何获取数据集中的分区数?

how to get the number of partitions in a dataset?

我知道有很多相同的问题,但 none 确实回答了我的问题。

我有场景数据。

   val data_codes = Seq("con_dist_1","con_dist_2","con_dist_3","con_dist_4","con_dist_5")
    val codes = data_codes.toDF("item_code")
    val partitioned_codes = codes.repartition($"item_code")
    println( "getNumPartitions : " + partitioned_codes.rdd.getNumPartitions);

输出:

getNumPartitions : 200

它应该给 5,为什么给 200?我哪里做错了,如何解决?

因为200是spark.sql.shuffle.partitions的标准值,适用于df.repartition。来自文档:

Returns a new Dataset partitioned by the given partitioning expressions, using spark.sql.shuffle.partitions as number of partitions. The resulting Dataset is hash partitioned.

分区数与数据框中(不同的)值的数量无关。重新分区确保所有具有相同键的记录都在同一个分区中,没有别的。所以在你的情况下,可能所有记录都在 1 个分区中,而 199 个分区是空的

即使您这样做 codes.repartition($"item_code",5),也不能保证您有 5 个大小相同的分区。据我所知,你不能在数据帧 API 中这样做,也许在带有自定义分区程序的 RDD 中