我创建了名为
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 为它在重新分区时计算的每个哈希值创建分区。