为什么我没有看到我请求的重新分区的较小任务?
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 个分区数,或者完全想出另一种分区策略,则需要将数据分配到更多的随机值中:)
我有一个数据集,我想将每个列的唯一值均匀地重新分区到 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 个分区数,或者完全想出另一种分区策略,则需要将数据分配到更多的随机值中:)