为什么我没有看到我请求的重新分区的较小任务?

Why don't I see smaller tasks for my requested repartitioning?

我有一个数据集,我想将每个列的唯一值均匀地重新分区到 10 个桶中,我想将这个结果分成大量分区,以便每个分区都很小。

col_1 保证是 ["CREATE", "UPDATE", "DELETE"]

中的值之一

我的代码如下所示:

df.show()
"""
+------+-----+-----+
| col_1|col_2|index|
+------+-----+-----+
|CREATE|    0|    0|
|CREATE|    0|    1|
|UPDATE|    0|    2|
|UPDATE|    0|    3|
|DELETE|    0|    4|
|DELETE|    0|    5|
|CREATE|    0|    6|
|CREATE|    0|    7|
|CREATE|    0|    8|
+------+-----+-----+
"""
df = df.withColumn(
  "partition_column",
  F.concat(
    F.col("col_1"),
    F.round( # Pick a random number between 0 and 9
      F.random() * F.lit(10),
      0
    )
  )
)

df = df.repartition(1000, F.col("partition_col"))

我看到我的大部分任务 运行 并以零行数据结束,我希望数据在我的 partition_col 上均匀分布到 1000 个分区中?

了解 Spark 用于分发其数据的机制是基于您提供给 repartition() 调用的列的哈希值很重要。

在这种情况下,您有一列的随机值介于 0 和 9 之间,而另一列仅包含 3 个不同值中的一个。

因此,您将有 10 * 3 个唯一的值组合进入 repartition() 调用。这意味着当您调用此列的基础哈希时,您将只有 30 个唯一值,Spark 将从中对其进行模数 1000。因此,您最多可以拥有 30 个分区。

如果您想超过 30 个分区数,或者完全想出另一种分区策略,则需要将数据分配到更多的随机值中:)