如何为 Databend 添加新的系统表
作者:尚卓燃(PsiACE)澳门科技大学在读硕士,Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committerhttps://github.com/PsiACE
Databend 的绝大部分系统表都位于 query/storage 这个目录下,当然,如果因为一些特殊的构建原因无法放在这个位置的话,也可以考虑临时放到 service/databases/system
这个目录(不推荐)。
系统表的定义主要关注两个内容:一个是表的信息,会包含表名、Schema 这些;另一个就是表中数据的生成/获取。刚好可以对应到 SyncSystemTable
和 AsyncSystemTable
这两个 Trait 中的 get_table_info
和 get_full_data
。到底是同步还是异步,取决于在获取数据时,是否涉及到异步函数的调用。
实现
本文将会以 credits
表的实现为例,介绍 Databend 系统表的实现,代码位于 https://github.com/datafuselabs/databend/blob/main/src/query/storages/system/src/credits_table.rs 。credits
会返回 Databend 所用到的上游依赖的信息,包括名字、版本和许可三个字段。
首先,需要参考其他系统表的实现,去定义表对应的结构,只需要保有表信息的字段就可以了。
接下来是为 CreditsTable
表实现 create
方法,对应的函数签名如下:
传入的 table_id
会在创建表时由 sys_db_meta.next_table_id()
生成。
schema
用于描述表的结构,需要使用 TableSchemaRefExt
和 TableField
来创建,字段名字和类型取决于表中的数据。
对于字符串类数据,可以使用 TableDataType::String
,其他基础类型也类似。但如果你需要允许字段中存在空值,比如字段是可以为空的 64 位无符号整数,则可以使用 TableDataType::Nullable(Box::new(TableDataType::Number(NumberDataType::UInt64)))
的方式,TableDataType::Nullable
表示允许空值,TableDataType::Number(NumberDataType::UInt64)
表征类型是 64 位无符号整数。
接下来就是定义表的信息,基本上只需要依葫芦画瓢,把描述、表名、元数据填上就好。
对于同步类型的表往往使用 SyncOneBlockSystemTable
创建,异步类型的则使用 AsyncOneBlockSystemTable
。
接下来,则是实现 SyncSystemTable
,SyncSystemTable
除了需要定义 NAME
之外,还需要实现 4 个函数 get_table_info
、get_full_data
、get_partitions
和 truncate
,由于后两个有默认实现,大多数时候不需要考虑实现自己的。(AsyncSystemTable
类似,只是没有 truncate
)
NAME
的值遵循 system.<name>
的格式。
get_table_info
只需要返回结构体中的表信息。
get_full_data
是相对重要的部分,因为每个表的逻辑都不太一样,credits
的三个字段基本类似,就只举 license
字段为例。
license
字段的信息是从名为 DATABEND_CREDITS_LICENSES
的环境变量(参见 common-building
)获取的,每条数据都用 ,
进行分隔。
字符串类型的列最后是从 Vec<Vec<u8>>
转化过来,其中字符串需要转化为 Vec<u8>
,所以在迭代的时候使用 .as_bytes().to_vec()
做了处理。
在获取所有数据后,就可以按 DataBlock
的形式返回表中的数据。非空类型,使用 from_data
,可空类型使用 from_opt_data
。
最后,要想将其集成到 Databend 中,还需要编辑 src/query/service/src/databases/system/system_database.rs
,将其注册到 SystemDatabase
中 。
测试
系统表的相关测试目前仍然位于 src/query/service/tests/it/storages/system.rs
。
对于内容不会经常动态变化的表,可以使用 Golden File 测试,其运行逻辑是将对应的表写入指定的文件中,然后对比每次测试时文件内容是否发生变化。
对于内容可能会变化的表,目前缺乏充分的测试手段。可以选择测试其中模式相对固定的部分,比如行和列的数目;也可以验证输出中是否包含特定的内容。
关于 Databend
Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。
👨💻 Databend Cloud:https://databend.cn
📖 Databend 文档:https://databend.rs/
💻 Wechat:Databend
版权声明: 本文为 InfoQ 作者【Databend】的原创文章。
原文链接:【http://xie.infoq.cn/article/e88df40c689a180f5692af6de】。文章转载请联系作者。
评论