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转换为TableProviderprovider_as_source: 将TableProvider转换为TableSource
TableSource 转 TableProvider 是可行的, 因为框架会为缺失的执行功能提供默认的实现或者是适配器。 TableProvider 转 TableSource 是没问题的,因为 TableProvider 已经包含了 TableSource 所有的功能,所以可以反向转换。
DataFusion 这种设计体现了关注点分离原则,使得查询优化和执行阶段可以分开处理,同时能够保证接口的一致性和可互操作性。
本文由作者按照 CC BY 4.0 进行授权