文章

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

TableSourceTableProvider 是可行的, 因为框架会为缺失的执行功能提供默认的实现或者是适配器。 TableProviderTableSource 是没问题的,因为 TableProvider 已经包含了 TableSource 所有的功能,所以可以反向转换。

DataFusion 这种设计体现了关注点分离原则,使得查询优化和执行阶段可以分开处理,同时能够保证接口的一致性和可互操作性。

本文由作者按照 CC BY 4.0 进行授权