PySpark 性能链式转换与连续重新分配

问题描述 投票:0回答:1

我对 PySpark 有点陌生。据我所知,它使用惰性求值,这意味着一系列转换的执行将被推迟,直到请求某些操作为止,此时 Spark 引擎会优化整个转换集,然后执行它们。

因此,从功能和性能的角度来看,我希望这样:

方法A

df = spark.read.parquet(path) 
df = df.filter(F.col('state') == 'CA')
df = df.select('id', 'name', 'subject')
df = df.groupBy('subject').count()

与此相同:

方法B

df = spark.read.parquet(path)\
    .filter(F.col('state') == 'CA')\
    .select('id', 'name', 'subject')\
    .groupBy('subject').count()

我喜欢方法 A 的风格,因为它允许我将逻辑分解为更小的(且可重用的)函数。

但是,我遇到了一些令我困惑的博客文章(例如这里这里这里)。这些帖子专门讨论了连续

withColumn
语句的使用,并建议使用单个
select
代替。根本原因似乎是,由于数据帧是不可变的,连续使用
withColumn
会损害性能。

所以我的问题是......在使用方法A时我会遇到同样的性能问题吗?或者这只是

withColumn
特有的问题?

apache-spark pyspark
1个回答
0
投票

方法A:

  • 在这种方法中,每一行都会创建一个新的 DataFrame,而之前的 DataFrame DataFrame 已替换为新的。
  • 这可能会导致性能问题,尤其是对于大型数据集, 由于 DataFrame 创建和管理的开销
  • 连续的 withColumn 语句可能会导致性能问题 PySpark 由于 DataFrame 的不变性。

方法B:

  • 您可以使用 单个 select 语句即可达到相同的结果。

  • 它在一次数据传递中执行转换。

  • 链中的每个操作都直接应用于DataFrame
    由前面的操作返回而不创建中间
    数据框。

方法 B 通常因其更好的性能和更清晰、更简洁的代码而受到青睐。

© www.soinside.com 2019 - 2024. All rights reserved.