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


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


PySpark DataFrame 的 repartition(~) 方法返回一个新的 PySpark DataFrame,其中数据分为指定数量的分区。此方法还允许按列值进行分区。

参数

1. numPartitions | int

分解 DataFrame 的分区数。

2. cols | strColumn

用于对 DataFrame 进行分区的列。

返回值

一个新的 PySpark 数据帧。

例子

对 PySpark DataFrame 进行分区

考虑以下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

就我而言,我们的 PySpark DataFrame 默认分为 8 个分区。

我们可以看到 DataFrame 的行是如何使用底层 RDD 的 glom() 方法进行分区的:

df.rdd.glom().collect()



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

在这里,我们可以看到确实有 8 个分区,但其中只有 3 个分区中有Row

现在,让我们重新分区 DataFrame,使行仅分为 2 个分区:

df_new = df.repartition(2)
df_new.rdd.getNumPartitions()



2

重新分区的 DataFrame 中的行分布现在是:

df_new.rdd.glom().collect()



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

如此处所示,无法保证行将均匀分布在分区中。

按列值对 PySpark DataFrame 进行分区

考虑以下PySpark DataFrame:

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



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

要按列 name 将此 PySpark DataFrame 重新分区为 2 个分区:

df_new = df.repartition(2, "name")
df_new.rdd.glom().collect()



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

在这里,请注意 name 具有相同值的行(在本例中为 'Alex')最终位于同一分区中。

我们还可以按多个列值重新分区:

df_new = df.repartition(4, "name", "age")
df_new.rdd.glom().collect()



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

在这里,我们将 nameage 列重新分区为 4 分区。

我们还可以通过仅指定列标签来使用默认的分区数:

df_new = df.repartition("name")
df_new.rdd.getNumPartitions()



1

相关用法


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