如何重新分区pyspark数据帧?

Neo*_*Neo 9 machine-learning bigdata apache-spark apache-spark-sql pyspark

data.rdd.getNumPartitions() # output 2456
Run Code Online (Sandbox Code Playgroud)

然后我这样做
data.rdd.repartition(3000)
data.rdd.getNumPartitions()#outout仍然是2456

如何更改分区数量.一种方法可以是首先将DF转换为rdd,重新分区然后将rdd转换回DF.但这需要很多时间.越来越多的分区是否使操作更加分散,因此更快?谢谢

Mic*_*may 14

您可以检查分区数量:

data.rdd.partitions.size
Run Code Online (Sandbox Code Playgroud)

要更改分区数:

newDF = data.repartition(3000)
Run Code Online (Sandbox Code Playgroud)

您可以检查分区数量:

newDF.rdd.partitions.size
Run Code Online (Sandbox Code Playgroud)

在重新分区时要小心数据随机播放,这很昂贵.coalesce如果需要,看看.

  • 另请记住,某些操作会自动更改分区数。你必须注意这一点。要记住的另一件事是强制使用散列分区器在例如加入时将记录物理混洗在一起。如果您想构建高效的 Spark 程序,您需要对分区有很好的了解。 (2认同)
  • 从“df.rdd.partitions.size”调用尝试中获取“RDD”对象没有属性“partitions”... (2认同)

小智 10

print df.rdd.getNumPartitions()
# 1


df.repartition(5)
print df.rdd.getNumPartitions()
# 1


df = df.repartition(5)
print df.rdd.getNumPartitions()
# 5
Run Code Online (Sandbox Code Playgroud)

请参阅Spark:
权威指南第 5 章 - 基本结构操作ISBN-13:978-1491912218
ISBN-10:1491912219


Gio*_*ous 8

如果你想增加分区数量,你可以使用repartition()

data = data.repartition(3000)
Run Code Online (Sandbox Code Playgroud)

如果您想减少分区数量,我建议您使用coalesce(),以避免完全洗牌:

对于过滤大型数据集后更有效地运行操作很有用。

data = data.coalesce(10)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅文章如何有效地重新分区 Spark DataFrames