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
和聚合。
当我使用 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
和聚合。