calcite適配器


calcite是一個動態數據管理框架,它提供了SQL解析與校驗,SQL優化,jdbc接口等能力,並且能夠支持對不同數據源的適配以及對SQL語法的擴展等,目前被廣泛用於Spark, Flink等大數據引擎中。

基礎對象和接口

Calcite是一個動態數據管理框架,它提供了sql解析以及jdbc接口,我們可以使用calcite做sql解析或者利用calcite適配器實現通過sql訪問任意類型的存儲

calcite中的關鍵接口介紹:

· Table接口:對某種類型的表的抽象,比如calcite內置的JdbcTable表示關係型數據庫中的表

· QueryableTable接口:表示可查詢的表,表示可以在這類表上執行select語句

· FilterableTable接口:可過濾的表,該接口摘借一個scan方法,calcite實現了對sql中的where條件的過濾,對於一些存儲的實現,如果將所有數據查詢出來後再過濾往往是行不通的,通過實現此接口,將過濾條件轉換成存儲的過濾api,先在查詢時通過數據源做過濾

· ModifiableTable接口:表示 可修改的表,如果想要對錶實現insert, update, delete,則需要實現此接口

· RelNode接口:關係表達式,SQL解析後的對象由關係表達式組成,是一個表達式樹

· RelOptRule抽象類:calcite在做SQL優化時使用的轉換表達式的規則,比如將RelNode轉換成存儲系統的查詢api的調用

· Schema接口:對錶的命名空間的抽象,對應於mysql中的database,一個表必須屬於一個schema

實現適配器

實現適配器需要做兩件事:

· 定義schema並實現Table,表示某種類型的表

· 實現SQL到查詢/更新的轉換

· 如果只需要支持查詢,則可以實現QueryableTable,如果需要支持通過數據源做條件過濾,則可實現FilterableTable接口

· 如果需要支持update/insert/delete語句,則需要實現ModifiableTable接口

自定義adapter通過SQL調用http接口

代碼地址:

首先實現Table:

calcite適配器

calcite適配器

calcite適配器

ObjectTable是一個從AbstractQueryableTable繼承的抽象類,其中封裝了對字段類型的處理,代碼如下:

calcite適配器

HttpTable是一個FilterableTable,其scan方法提供了對查詢的實現,其邏輯非常簡單,拿到可以用於下沉到數據源的過濾參數,並通過過濾參數調用invoker獲取scan的結果,calcite會基於此結果對數據再次做過濾,執行不能下沉到數據源的過濾條件得到最終的結果。invoker對象是一個Function,用於提供select語義的支持,通過構造器傳入。

接下來定義Schema,可以從AbstractSchema繼承:

calcite適配器

接下來實現一個工廠,用於創建HttpApiSchema:

calcite適配器

tableDefParser的作用是解析operand這個map中的kv,並生成HttpTable對象,而operand則是從json配置中來,json配置中定義schema的基礎信息和每個table的基礎信息,其中的operand字段的值則是自定義的內容,可自行解析(與上面的tableDefParser的邏輯一致):

calcite適配器

最後實現查詢邏輯,即invoker那個Function的實現,期核心代碼如下:

calcite適配器

致此,通過sql的select調用http接口的實現完成,通過jdbc接口使用方式如下:

calcite適配器

LogicTableExecutor實現如下:

calcite適配器


分享到:


相關文章: