當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。