当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python PySpark DataFrame coalesce方法用法及代码示例


PySpark DataFrame 的 coalesce(~) 方法在不进行混洗的情况下减少了 PySpark DataFrame 的分区数量。

参数

1. num_partitions | int

将 PySpark DataFrame 的数据分割成的分区数。

返回值

一个新的 PySpark 数据帧。

例子

考虑以下PySpark DataFrame:

df = spark.createDataFrame([["Alex", 20], ["Bob", 30], ["Cathy", 40]], ["name", "age"])
df.show()



+-----+---+
| name|age|
+-----+---+
| Alex| 20|
|  Bob| 30|
|Cathy| 40|
+-----+---+

默认分区数量由您的 PySpark 配置决定。就我而言,默认分区数是:

df.rdd.getNumPartitions()



8

我们可以使用底层 RDD 的 glom() 方法查看 PySpark DataFrame 每个分区的实际内容:

df.rdd.glom().collect()



[[],
 [],
 [Row(name='Alex', age=20)],
 [],
 [],
 [Row(name='Bob', age=30)],
 [],
 [Row(name='Cathy', age=40)]]

我们可以看到我们确实有 8 个分区,其中 3 个包含 Row

在不进行混洗的情况下减少 PySpark DataFrame 的分区数量

要减少 DataFrame 的分区数量而不进行混排,请使用 coalesce(~)

df_new = df.coalesce(2)
df_new.rdd.glom().collect()



[[Row(name='Alex', age=20)],
 [Row(name='Bob', age=30), Row(name='Cathy', age=40)]]

在这里,我们可以看到我们现在只有 2 个分区!

注意

方法 repartition(~) coalesce(~) 都用于更改分区数量,但这里有一些显著差异:

  • repartition(~) 通常会导致洗牌操作,而 coalesce(~) 则不会。这意味着 coalesce(~) 的成本低于 repartition(~) ,因为数据不必在工作节点之间传输太多。

  • coalesce(~)专门用于减少分区数量。

相关用法


注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 PySpark DataFrame | coalesce method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。