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工程师的内容。我建议您就此提出另一个问题