DataFusion TableSource 和 TableProvider
DataFusion TableSource 和 TableProvider
学习理解 Datafusion 的 TableSource, TableProvider 之间的关系
一、TableSource 和 TableProvider 的作用
1. TableSource
TableSource
是在逻辑查询规划和优化阶段使用的 Trait
, 提供:
schema
信息filter
下推能力table
类型信息- 约束条件 (比如主键)
它只关注逻辑层面的功能, 不涉及实际的物理执行。这是一个轻量级的接口, 让逻辑查询计划能够独立于具体的执行引擎。 (TODO: 什么是具体的执行引擎呢?)
2. TableProvider
TableProvider
扩展了 TableSource
, 增加了物理执行所需的功能:
- 实际扫描表的能力 scan 方法
- 统计信息
- 数据插入功能
- 更多执行相关能力 它是完整的
Table
接口, 负责将逻辑计划转换为可执行的物理计划, 并处理实际数据的扫描和操作。
二、TableSource 和 TableProvider 的关系
根据 DataFusion 源码中的注释可以观察到:
TableProvider trait provides additional capabilities needed for physical query execution (such as the ability to perform a scan). The reason for having two separate traits is to avoid having the logical plan code be dependent on the DataFusion execution engine.
这说明:
TableSource
专注于逻辑计划(与具体执行无关)TableProvider
添加了执行细节- 分离这两个接口允许其他项目重用 DataFusion 的逻辑计划, 但是可以实现自己的执行引擎
三、转换机制
DataFusion 提供了两个转换函数:
source_as_provider
: 将TableSource
转换为TableProvider
provider_as_source
: 将TableProvider
转换为TableSource
TableSource
转 TableProvider
是可行的, 因为框架会为缺失的执行功能提供默认的实现或者是适配器。 TableProvider
转 TableSource
是没问题的,因为 TableProvider
已经包含了 TableSource
所有的功能,所以可以反向转换。
DataFusion 这种设计体现了关注点分离原则,使得查询优化和执行阶段可以分开处理,同时能够保证接口的一致性和可互操作性。
本文由作者按照 CC BY 4.0 进行授权