最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

如何為 Databend 添加新的系統(tǒng)表

2023-05-06 17:51 作者:Databend  | 我要投稿
作者:尚卓燃(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

如何為 Databend 添加新的系統(tǒng)表的評論 (共 條)

分享到微博請遵守國家法律
曲阜市| 会泽县| 江阴市| 察隅县| 泰安市| 常山县| 伊宁市| 即墨市| 当阳市| 拜城县| 仪征市| 锦州市| 澎湖县| 含山县| 同德县| 石首市| 济南市| 沂南县| 澜沧| 邹平县| 嘉义市| 静海县| 高唐县| 靖远县| 高陵县| 松滋市| 桐城市| 即墨市| 澄迈县| 利津县| 文山县| 英山县| 元谋县| 五莲县| 新乡市| 会泽县| 余庆县| 博湖县| 英超| 龙南县| 睢宁县|