0

我有一个数据集,我想将每个列的唯一值均匀地重新分区为 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_col1000 个分区中吗?

4

1 回答 1

0

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

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

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

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

于 2021-12-13T20:35:34.080 回答