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適配器](http://p2.ttnews.xyz/loading.gif)
![calcite適配器](http://p2.ttnews.xyz/loading.gif)
ObjectTable是一個從AbstractQueryableTable繼承的抽象類,其中封裝了對字段類型的處理,代碼如下:
HttpTable是一個FilterableTable,其scan方法提供了對查詢的實現,其邏輯非常簡單,拿到可以用於下沉到數據源的過濾參數,並通過過濾參數調用invoker獲取scan的結果,calcite會基於此結果對數據再次做過濾,執行不能下沉到數據源的過濾條件得到最終的結果。invoker對象是一個Function,用於提供select語義的支持,通過構造器傳入。
接下來定義Schema,可以從AbstractSchema繼承:
接下來實現一個工廠,用於創建HttpApiSchema:
tableDefParser的作用是解析operand這個map中的kv,並生成HttpTable對象,而operand則是從json配置中來,json配置中定義schema的基礎信息和每個table的基礎信息,其中的operand字段的值則是自定義的內容,可自行解析(與上面的tableDefParser的邏輯一致):
最後實現查詢邏輯,即invoker那個Function的實現,期核心代碼如下:
致此,通過sql的select調用http接口的實現完成,通過jdbc接口使用方式如下:
LogicTableExecutor實現如下:
閱讀更多 無醉 的文章