我对 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
特有的问题?
方法A:
方法B:
您可以使用 单个 select 语句即可达到相同的结果。
它在一次数据传递中执行转换。
链中的每个操作都直接应用于DataFrame
由前面的操作返回而不创建中间
数据框。
方法 B 通常因其更好的性能和更清晰、更简洁的代码而受到青睐。