一、概述

Spark 针对 DataSource V1 预定义了四种 scan 接口,Tablescan、 Prunedscan、 PrunedFilteredscan、 Catalystscan,如果开发者自己实现的DataSource是实现了这四种接口之一的,在 scan 到执行计划的底层 Relation 时,就会调用来扫描文件。

对于 DataSourceStrategy,是处理使用 source api 的定义的 Data Source,会把对应的 LogicalRelation 转换为 RowDataSourceScanExec:

SQL角度讲有基本的过滤、语法树。语法树过滤也有2个层次,一个是基本的过滤,一个是真
正的解析。优化是对各种fiter进行合并,而且会调整顺序。最后从 Catalyst 角度,它会变成 RDD 进行操作,最后会装入到 DataSourceStrategy。DataSourceStrategy 会通过 Parquet 高层的 API 来操作 Parquet。Parquet 内部再收到上层的过滤条件的时候底层如何映射。

DataSourceStrategy 策略最后会生成 RowDataSourceScanExec,最终会调用 CatalystScan\PrunedScan\TableScan 的 $buildScan()$ 方法生成 RDD[Row],再调用 $toCatalystRDD()$ 将 RDD[Row] 转换为 RDD[InternalRow]。

$selectFilters()$ 就会把对应的 Catalyst 的 Filters 转换为 Data source Filters

二、实现

http://www.linuxboy.net/yunjisuan/51090.html