关于 jdbc:Spark Dataframe 是否对 DB 应用了转换?

Does Spark Dataframe aplies the transformations against DB?

当我用 PySpark 获得一张桌子时

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

1
2
3
4
5
6
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()

然后我应用了一些转换,比如 joins 和 groupBy

1
2
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 将使用单个执行器读取所有需要的数据(在应用可能的投影和选择之后),在第二个片段中,初始 query 的结果(加上投影和选择)到 S3 并从那里并行读取。在这两种情况下,Spark 都应该能够下推投影 (id, tax).

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