当我拿到PySpark的桌子时
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()
或
df3 = df1.join(df2, df1.id == df2.id)
df_res = df3.groupBy("id").agg({'tax': 'sum'})
然后我应用了一些转换,例如join和groupBy
{{1}}
是针对数据库完成的吗? 如果是,那么在记忆中这样做的方法是什么?
答案 0 :(得分:2)
不是。虽然Spark可以推送简单的投影和选择(详细信息取决于特定的数据源实现),但它不会对数据库应用繁重的处理,除非在受支持的数据源中明确指示它。
例如,对于jdbc
,您传递subquery 作为table
参数,而使用com.databricks.spark.redshift
则可以使用query
选项。
使用第一个代码段(jdbc
),Spark将使用a single executor读取所有必需的数据(在应用可能的投影和选择之后),在第二个代码段中显示初始query
的结果(加上投影和选择)到S3并从那里并行读取。在这两种情况下,Spark都应该能够按下投影(id, tax)
。
之后,Spark将在集群内部本地处理数据,这包括join
和聚合。