如何為 Databend 添加新的系統(tǒng)表
作者:尚卓燃(PsiACE)澳門科技大學在讀碩士,Databend 研發(fā)工程師實習生
Apache OpenDAL(Incubating) Committer? ? ?https://github.com/PsiACE

Databend 的系統(tǒng)表位于?query/storage?目錄下,當然,如果因為一些特殊的構(gòu)建原因無法放在這個位置的話,也可以考慮臨時放到?service/databases/system
?這個目錄(不推薦)。
系統(tǒng)表的定義主要關注兩個內(nèi)容:一個是表的信息,會包含表名、Schema 這些;另一個就是表中數(shù)據(jù)的生成/獲取。剛好可以對應到?SyncSystemTable
?和?AsyncSystemTable
?這兩個 Trait 中的?get_table_info
?和?get_full_data
?。到底是同步還是異步,取決于在獲取數(shù)據(jù)時,是否涉及到異步函數(shù)的調(diào)用。
實現(xiàn)
本文將會以?credits
?表的實現(xiàn)為例,介紹 Databend 系統(tǒng)表的實現(xiàn),代碼位于 https://github.com/datafuselabs/databend/blob/main/src/query/storages/system/src/credits_table.rs 。credits
?會返回 Databend 所用到的上游依賴的信息,包括名字、版本和許可三個字段。
首先,需要參考其他系統(tǒng)表的實現(xiàn),去定義表對應的結(jié)構(gòu),只需要保有表信息的字段就可以了。
接下來是為?CreditsTable
?表實現(xiàn)?create
?方法,對應的函數(shù)簽名如下:
傳入的?table_id
?會在創(chuàng)建表時由?sys_db_meta.next_table_id()
?生成。
schema
?用于描述表的結(jié)構(gòu),需要使用?TableSchemaRefExt
?和?TableField
?來創(chuàng)建,字段名字和類型取決于表中的數(shù)據(jù)。
對于字符串類數(shù)據(jù),可以使用?TableDataType::String
?,其他基礎類型也類似。但如果你需要允許字段中存在空值,比如字段是可以為空的 64 位無符號整數(shù),則可以使用?TableDataType::Nullable(Box::new(TableDataType::Number(NumberDataType::UInt64)))
?的方式,TableDataType::Nullable
?表示允許空值,TableDataType::Number(NumberDataType::UInt64)
?表征類型是 64 位無符號整數(shù)。
接下來就是定義表的信息,基本上只需要依葫蘆畫瓢,把描述、表名、元數(shù)據(jù)填上就好。
對于同步類型的表往往使用?SyncOneBlockSystemTable
?創(chuàng)建,異步類型的則使用?AsyncOneBlockSystemTable
?。
接下來,則是實現(xiàn)?SyncSystemTable
?,SyncSystemTable
?除了需要定義?NAME
?之外,還需要實現(xiàn) 4 個函數(shù)?get_table_info
?、get_full_data
、get_partitions
?和?truncate?
,由于后兩個有默認實現(xiàn),大多數(shù)時候不需要考慮實現(xiàn)自己的。(AsyncSystemTable
?類似,只是沒有?truncate
?)
NAME
?的值遵循?system.<name>
?的格式。
get_table_info
?只需要返回結(jié)構(gòu)體中的表信息。
get_full_data
?是相對重要的部分,因為每個表的邏輯都不太一樣,credits
?的三個字段基本類似,就只舉?license
?字段為例。
license
?字段的信息是從名為?DATABEND_CREDITS_LICENSES
?的環(huán)境變量(參見?common-building
)獲取的,每條數(shù)據(jù)都用?,
?進行分隔。
字符串類型的列最后是從?Vec<Vec<u8>>
?轉(zhuǎn)化過來,其中字符串需要轉(zhuǎn)化為?Vec<u8>
?,所以在迭代的時候使用?.as_bytes().to_vec()
?做了處理。
在獲取所有數(shù)據(jù)后,就可以按?DataBlock
?的形式返回表中的數(shù)據(jù)。非空類型,使用?from_data
?,可空類型使用?from_opt_data
?。
最后,要想將其集成到 Databend 中,還需要編輯?src/query/service/src/databases/system/system_database.rs
,將其注冊到?SystemDatabase
?中 。
測試
系統(tǒng)表的相關測試位于?src/query/service/tests/it/storages/system.rs
?。
對于內(nèi)容不會經(jīng)常動態(tài)變化的表,可以使用 Golden File 測試,其運行邏輯是將對應的表寫入指定的文件中,然后對比每次測試時文件內(nèi)容是否發(fā)生變化。
對于內(nèi)容可能會變化的表,目前缺乏充分的測試手段??梢赃x擇測試其中模式相對固定的部分,比如行和列的數(shù)目;也可以驗證輸出中是否包含特定的內(nèi)容。
關于?Databend
Databend 是一款開源、彈性、低成本,基于對象存儲也可以做實時分析的新式數(shù)倉。期待您的關注,一起探索云原生數(shù)倉解決方案,打造新一代開源 Data Cloud。
???????Databend Cloud:https://databend.cn
???Databend 文檔:https://databend.rs/
???Wechat:Databend
??GitHub:https://github.com/datafuselabs/databend