背景
本文基于 SPARK 3.3.0
在之前的文章 SPARK中的FileSourceStrategy,DataSourceStrategy以及DataSourceV2Strategy规则 我们有提到 DS V2 push down的功能,如JDBC 复杂下推,以及Parquet的聚合下推等等。其实这里面有个比较大的背景–就是TableCatalog类。
结论
先说结论,这些聚合下推的大前提是,在spark中已经配置了对应的catalog,如下:
spark.sql.catalog.h2=org.apache.spark.sql.execution.datasources.v2.jdbc.JDBCTableCatalog
分析
在Rule V2ScanRelationPushDown一系列的规则中,第一个规则createScanBuilder:
private def createScanBuilder(plan: LogicalPlan) = plan.transform {
case r: DataSourceV2Relation =>
ScanBuilderHolder(r.output, r, r.table.asReadable.newScanBuilder(r.options))
}
只有是DataSourceV2Relation类型,也就是 DS v2,才会转换为 ScanBuilderHolder, 而后续的pushDownFilters,pushDownAggregates规则则是基于ScanBuilderHolder来做转换的(如果有遇到ScanBuilderHolder类型才会进行DS v2特有的规则转换),所以DataSourceV2Relation是从哪里来的是关键。
直接说重点:
在RULE ResolveRelations中会进行 UnresolvedRelation到DataSourceV2Relation或是UnresolvedCatalogRelation的转换:
object ResolveRelations extends Rule[LogicalPlan] {
...
def apply(plan: LogicalPlan)
: LogicalPlan = plan.resolveOperatorsUpWithPruning(AlwaysProcess.fn, ruleId) {
case i @ InsertIntoStatement(table, _, _, _, _, _) if i.query.resolved =>
val relation = table match {
case u: UnresolvedRelation if !u.isStreaming =&
Spark 3.3.0 中的数据源优化:TableCatalog与DSV2下推

本文介绍了Spark 3.3.0中TableCatalog的角色以及DSV2(DataSourceV2)优化,特别是如何通过配置 Catalog 实现JDBC等数据源的下推优化。在Spark SQL中,DSV2的聚合下推和过滤优化依赖于已注册的Catalog。当使用如`spark.sql.catalog.h2=org.apache.spark.sql.execution.datasources.v2.jdbc.JDBCTableCatalog`这样的配置时,才能启用JDBC数据源的DSV2特性。对于其他数据源,需要实现相应的TableCatalog并配置。博客详细阐述了从UnresolvedRelation到DataSourceV2Relation的转换过程,以及如何通过createRelation方法创建不同类型的LogicalPlan。总的来说,正确配置和使用TableCatalog是实现DSV2优化的关键。
最低0.47元/天 解锁文章
167

被折叠的 条评论
为什么被折叠?



