您好,登錄后才能下訂單哦!
??Apache Calcite是一個動態數據管理框架。它包含了許多組成典型數據管理系統的經典模塊,但省略了一些關鍵性的功能: 數據存儲,數據處理算法和元數據存儲庫。
??Calcite有意地遠離了存儲和處理數據的任務。如我們所見,這使得它成為在應用程序和一個或多個數據存儲位置和數據處理引擎之間的最佳中間層選擇。它同樣也是構建數據庫的完美基礎選擇: 只需要在它的基礎上添加數據。
??下面為了展示說明,我們建立了一個空的Calcite實例并查詢數據。
public static class HrSchema {
public final Employee[] emps = 0;
public final Department[] depts = 0;
}
Class.forName("org.apache.calcite.jdbc.Driver");
Properties info = new Properties();
info.setProperty("lex", "JAVA");
Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
Schema schema = ReflectiveSchema.create(calciteConnection,
rootSchema, "hr", new HrSchema());
rootSchema.add("hr", schema);
Statement statement = calciteConnection.createStatement();
ResultSet resultSet = statement.executeQuery(
"select d.deptno, min(e.empid)\n"
+ "from hr.emps as e\n"
+ "join hr.depts as d\n"
+ " on e.deptno = d.deptno\n"
+ "group by d.deptno\n"
+ "having count(*) > 1");
print(resultSet);
resultSet.close();
statement.close();
connection.close();
??大家可能對上面的代碼比較疑惑,數據庫在哪里?這里沒有數據庫。在我們調用ReflectiveSchema.create將一個java object注冊為schema,以及這個集合的成員emps和depts作為表之前,connection都是空的。
??Calcite并不想管理數據,它甚至沒有標準的數據格式。上面的例子使用了內存數據集,并且使用linq4j libaray的groupBy和join操作來對他們進行處理,但Calcite同樣也支持以其他標準數據格式對數據進行處理,例如JDBC。在上面的例子中,將下面的代碼
Schema schema = ReflectiveSchema.create(calciteConnection, rootSchema, "hr", new HrSchema());
替換成:
Class.forName("com.mysql.jdbc.Driver");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost");
dataSource.setUsername("username");
dataSource.setPassword("password");
Schema schema = JdbcSchema.create(rootSchema, "hr", dataSource,
null, "name");
??Calcite就可以通過JDBC來執行同樣的查詢了。對應用來說,數據和API不會產生任何變化,但底層的實現卻差異巨大。Calcite使用優化規則來將JOIN和GROUP BY操作下推到源數據庫中進行執行。
基于內存和基于JDBC只是兩個大家較為熟悉的例子。Calcite可以處理任意一種數據源和數據格式。如果想要增加數據源,我們需要編寫一個適配器來告訴Calcite,它應該將數據源中的什么樣的集合視為“table”來進行操作。
如果想要進一步更智能地集成,我們可以編寫自己的優化器規則。優化器規則允許Calcite來處理新格式的數據,并注冊新的算子(如更優化的join算法),同時還允許Calcite來對查詢轉化為算子的過程進行優化。Calcite會結合用戶提供的規則和算子與系統內建規則和算子,執行基于成本的優化,生成高效的執行計劃。
??Calcite在example/csv子項目下提供了CSV的適配器。它能很好地支持應用程序的功能需求,同時如果正在編寫自己的適配器,它也能作為一個足夠簡單的例子來作為參考模板。
具體使用CSV 適配器和編寫其他適配器的方法請查看下一章節2教程。
幫助(HOWTO)章節提供了更多使用其他適配器的信息,和常用的使用場景。
??Calcite提供了以下特性:
1) 查詢解析器、驗證器和優化器
2) 以JSON格式讀取模型
3) 標準函數以及標準聚合函數
4) 針對Linq4j和JDBC后端的JDBC查詢
5) Linq4j front-end
6) SQL特性:SELECT, FROM (包括JOIN語法), WHERE, GROUP BY (包括GROUPING SETS), 聚合函數 (包括COUNT(DISTINCT...) 和FILTER),HAVING, ORDER BY(包括NULLS FIRST/LAST), 集合操作 (UNION, INTERSECT, MINUS), 子查詢(包括相關子查詢), 窗口聚合函數,LIMIT (Postgres語法); SQL reference章節中提供了更詳細的信息
7) 本地和遠程JDBC驅動器,詳情參考Avatica章節
8) 多種適配器
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。