Spark Dataframe 是否应用了针对 DB 的转换?

Does Spark Dataframe aplies the transformations against DB?

当我使用 PySpark 获得 table 时

df1 = session.read.jdbc(url=self.url,
                        table=self.table,
                        properties={"driver": self.driver,
                                    "user": self.user,
                                    "password": self.password})

df1 = sql.read.format("com.databricks.spark.redshift")
                .options(url=self.url, 
                        query=self.table,
                        user=self.user,
                        password=self.password,
                        tempdir="s3://path/data/").load()

然后我应用一些转换,例如连接和 groupBy

df3 = df1.join(df2, df1.id == df2.id)
df_res = df3.groupBy("id").agg({'tax': 'sum'})

是针对数据库做的吗? 如果是,在内存中有什么方法?

不是。虽然 Spark 可以下推简单的投影和选择(细节取决于特定的数据源实现),但它不会对数据库应用大量处理,除非在受支持的数据源中明确指示它。

例如,对于 jdbc,您传递一个 作为 table 参数,对于 com.databricks.spark.redshift,您可以使用 query 选项。

对于第一个片段 (jdbc),Spark 将使用 a single executor 读取所有必需的数据(在应用可能的投影和选择之后),在第二个片段中,初始 [=13] 的结果=](加上投影和选择)到 S3 并从那里并行读取。在这两种情况下,Spark 都应该能够下推投影 (id, tax).

之后 Spark 将在集群内部本地处理数据,这包括 join 和聚合。