Spark Dataframe 是不是对 DB 应用转换?

Posted

技术标签:

【中文标题】Spark Dataframe 是不是对 DB 应用转换?【英文标题】:Does Spark Dataframe aplies the transformations against DB?Spark Dataframe 是否对 DB 应用转换? 【发布时间】:2017-06-06 10:52:01 【问题描述】:

当我使用 PySpark 获得一张桌子时

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()

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

df3 = df1.join(df2, df1.id == df2.id)
df_res = df3.groupBy("id").agg('tax': 'sum')

这是针对数据库的吗? 如果是的话,在内存中这样做的方法是什么?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于Spark Dataframe 是不是对 DB 应用转换?的主要内容,如果未能解决你的问题,请参考以下文章

[Spark][Python][DataFrame][SQL]Spark对DataFrame直接执行SQL处理的例子

就地圆形 Spark DataFrame

Spark DataFrame mapPartitions

值 createGlobalTempView 不是 apache.org.spark.sql.DataFrame 的成员

如何将 Scala Spark Dataframe 转换为 LinkedHashMap[String, String]

为啥 Spark 在创建 DataFrame 时会推断二进制而不是 Array[Byte]?