内置 Spark 转换是否比 Spark SQL 查询更快?

Are built-in Spark transformations faster than Spark SQL queries?

我们在 AWS Glue 中执行,使用 Python 3 和 Spark 2.4 以及 pyspark SparkSQL 模块。我想弄清楚 运行 使用本机内置 Spark API 转换(映射、过滤器等)的操作是否比 运行 更快通过执行原始 SparkSQL 查询进行操作。

比如我想做一个简单的过滤操作(比方说,只抓取年份为2020的那行数据),下面是不是等价的?

data = spark.read.csv(filepath)
data_filtered = data.filter(data.year = 2020)
data = spark.read.csv(filepath)
spark.registerDataFrameAsTable(data, 'data')
data_filtered = spark.sql("SELECT * FROM data WHERE year = 2020")

这显然是一个非常简单的示例,但同样的问题也适用于其他操作 - 联接、联合、映射等。如果操作链接在一起怎么办?将一系列转换和操作编写为冗长、复杂的 SQL 查询是否会像使用内置操作编写的相同序列一样优化?

我的部分困惑源于我不确定 Spark 如何优化原始查询的执行计划,而不是内置操作。我知道有转换和动作,在API中是不同的。 Spark 后端是否对查询的操作进行了类似的分类?

通常,我会尝试 运行 进行一些实验,但因为我们处理的是非常大的数据,并且我们按时间和计算资源为 AWS Glue 作业付费,要完全回答这个问题,需要对链接在一起的不同操作进行大量测试,我更愿意在这里回答问题。

根据文档,无论您使用任何 api 数据框或数据集或 spark sql,性能都是相同的。因为在内部,所有内容都会转换为 RDD(弹性分布式数据集),这是 spark 提供的默认抽象。您可以比较 spark sql 和数据框的解释计划,它们是相同的。如果您正在执行多个操作,如计数、获取、收集等,它会实现计划并且可能会有时间差异,但在大多数情况下,您将对 spark sql 和数据框 api 具有相同的性能如果你在做同样的操作。