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

Apache spark 如何获取数据集中的分区数?,apache-spark,apache-spark-sql,apache-spark-dataset,Apache Spark,Apache Spark Sql,Apache Spark Dataset,我知道在同一个问题上有很多问题,但没有一个真正回答我的问题 我有场景数据。 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( "get

我知道在同一个问题上有很多问题,但没有一个真正回答我的问题

我有场景数据。

   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
。从文档中:

返回按给定分区划分的新数据集 表达式,使用spark.sql.shuffle.partitions作为 分区。生成的数据集是散列分区的

分区的数量与数据帧中(不同)值的数量不相关。重新分区可确保具有相同密钥的所有记录都位于同一分区中,而不是其他分区。因此,在您的情况下,所有记录都可能位于1个分区中,而199个分区为空


即使您进行了
code.repartition($“item\u code”,5)
,也不能保证您有5个大小相同的分区。如果您不能在dataframe API中实现这一点,可能在RDD中使用自定义分区器

@bEngineer,正如我所说,您可以执行
代码.重新分区($“item\u code”,data\u code.size)
,但这仍然不能为每个分区提供1行。分区只是一块数据,您不应该太担心分区的确切大小或是否有一些空分区…@b工程师在
mapPartitions
中,您需要在
迭代器[Row]
上添加一个
groupBy
来分隔代码。为此,您需要将
迭代器
转换为类似于
列表
向量
@b工程师的内容。我建议您就此提出另一个问题