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和聚合。
来源:https://www.codenong.com/44388029/