gpt4 book ai didi

apache-spark - 为什么在重新分区 Spark 数据帧时会得到这么多空分区?

转载 作者:行者123 更新时间:2023-12-04 11:47:37 25 4
gpt4 key购买 nike

我想在 3 列上对数据框“df1”进行分区。对于这 3 列,此数据框恰好有 990 个独特的组合:

In [17]: df1.createOrReplaceTempView("df1_view")

In [18]: spark.sql("select count(*) from (select distinct(col1,col2,col3) from df1_view) as t").show()
+--------+
|count(1)|
+--------+
| 990|
+--------+

为了优化这个数据帧的处理,我想对 df1 进行分区以获得 990 个分区,每个关键可能性一个:
In [19]: df1.rdd.getNumPartitions()
Out[19]: 24

In [20]: df2 = df1.repartition(990, "col1", "col2", "col3")

In [21]: df2.rdd.getNumPartitions()
Out[21]: 990

我写了一个简单的方法来计算每个分区中的行数:
In [22]: def f(iterator):
...: a = 0
...: for partition in iterator:
...: a = a + 1
...: print(a)
...:

In [23]: df2.foreachPartition(f)

我注意到实际上我得到的是 628 个带有一个或多个键值的分区,以及 362 个空分区。

我假设 spark 会以均匀的方式重新分区(1 个键值 = 1 个分区),但这似乎不是这样,我觉得这种重新分区会增加数据倾斜,即使它应该是相反的......

Spark 用于在列上对数据帧进行分区的算法是什么?
有没有办法实现我认为可能的目标?

我在 Cloudera 上使用 Spark 2.2.0。

最佳答案

为了跨分区分发数据,spark 需要以某种方式将列的值转换为分区的索引。 Spark 中有两个默认分区器 - HashPartitioner 和 RangePartitioner。 Spark 中的不同转换可以应用不同的分区器 - 例如join将应用哈希分区器。

基本上,哈希分区器公式将值转换为分区索引将是 value.hashCode() % numOfPartitions .在您的情况下,多个值映射到相同的分区索引。

如果您想要更好的分发,您可以实现自己的分区器。更多关于它是hereherehere .

关于apache-spark - 为什么在重新分区 Spark 数据帧时会得到这么多空分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50694848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com