Spark Dataframe是否适用于针对DB的转换?

时间:2017-06-06 10:52:01

标签: apache-spark jdbc pyspark apache-spark-sql pyspark-sql

当我拿到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}}

是针对数据库完成的吗? 如果是,那么在记忆中这样做的方法是什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

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