Spark:如何为每个唯一的表达式值获取分区?

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

我创建了名为

bucket
的技术专栏,并将其用于重新分区我的DataFrame。但是我得到的分区数量较少,然后我有 partitionExpr 的唯一值。

有什么方法可以让 Spark 生成精确的分区计数吗?

我这样做:

val dfPartition = df.repartition(2 * 5, $"loading_dt_part", $"bucket")

其中 2 是 loading_dt_part 列中唯一值的计数,5 是 bucket 列中唯一值的计数。

然后我检查我的分区:

dfPartition
    .select("loading_dt_part", "bucket")
    .distinct()
    .withColumn("partition", spark_partition_id())
    .show(100)

得到这个:

+---------------+------+---------+
|loading_dt_part|bucket|partition|
+---------------+------+---------+
|       20220831|   1.0|        1|
|       20221231|   1.0|        2|
|       20221231|   5.0|        2|
|       20221231|   0.0|        3|
|       20221231|   3.0|        4|
|       20221231|   2.0|        5|
|       20220831|   5.0|        6|
|       20220831|   4.0|        6|
|       20221231|   4.0|        7|
|       20220831|   3.0|        8|
|       20220831|   2.0|        8|
|       20220831|   0.0|        8|
+---------------+------+---------+

在这里我们看到,例如,桶 1 和 5 被放置在同一个分区中。所以我得到了 8 个分区,而不是我想要的 10 个。

我明白为什么会这样。因为,一些哈希值可以在数据拆分成分区后出现在同一个桶中。但也许有某种方式可以说 Spark 为它在重新分区时计算的每个哈希值创建分区。

apache-spark partitioning
© www.soinside.com 2019 - 2024. All rights reserved.