PySpark DataFrame 的 repartition(~)
方法返回一个新的 PySpark DataFrame,其中数据分为指定数量的分区。此方法还允许按列值进行分区。
参数
1. numPartitions
| int
分解 DataFrame 的分区数。
2. cols
| str
或 Column
用于对 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)]]
在这里,我们将 name
和 age
列重新分区为 4
分区。
我们还可以通过仅指定列标签来使用默认的分区数:
df_new = df.repartition("name")
df_new.rdd.getNumPartitions()
1
相关用法
- Python PySpark DataFrame replace方法用法及代码示例
- Python Pandas DataFrame replace方法用法及代码示例
- Python Pandas DataFrame reset_index方法用法及代码示例
- Python Pandas DataFrame reorder_levels方法用法及代码示例
- Python Pandas DataFrame resample方法用法及代码示例
- Python Pandas DataFrame reindex方法用法及代码示例
- Python Pandas DataFrame rename_axis方法用法及代码示例
- Python Pandas DataFrame rename方法用法及代码示例
- Python Pandas DataFrame rank方法用法及代码示例
- Python Pandas DataFrame rdiv方法用法及代码示例
- Python Pandas DataFrame radd方法用法及代码示例
- Python PySpark DataFrame rdd属性用法及代码示例
- Python Pandas DataFrame rsub方法用法及代码示例
- Python Pandas DataFrame round方法用法及代码示例
- Python PySpark DataFrame randomSplit方法用法及代码示例
- Python Pandas DataFrame rolling方法用法及代码示例
- Python Pandas DataFrame rpow方法用法及代码示例
- Python Pandas DataFrame rfloordiv方法用法及代码示例
- Python Pandas DataFrame rtruediv方法用法及代码示例
- Python Pandas DataFrame rmod方法用法及代码示例
- Python Pandas DataFrame rmul方法用法及代码示例
- Python Pandas DataFrame empty属性用法及代码示例
- Python Pandas DataFrame pop方法用法及代码示例
- Python Pandas DataFrame nsmallest方法用法及代码示例
- Python Pandas DataFrame sample方法用法及代码示例
注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 PySpark DataFrame | repartition method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。