Apache Calcite官方文檔中文版-概覽-1.背景

第一部分 概覽

1. 背景

  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");

%emsp;%emsp;Calcite就可以通過JDBC來執行同樣的查詢了。對應用來說,數據和API不會產生任何變化,但底層的實現卻差異巨大。Calcite使用優化規則來將JOIN和GROUP BY操作下推到源數據庫中進行執行。
%emsp;%emsp;基於內存和基於JDBC只是兩個大家較爲熟悉的例子。Calcite可以處理任意一種數據源和數據格式。如果想要增加數據源,我們需要編寫一個適配器來告訴Calcite,它應該將數據源中的什麼樣的集合視爲“table”來進行操作。
%emsp;%emsp;如果想要進一步更智能地集成,我們可以編寫自己的優化器規則。優化器規則允許Calcite來處理新格式的數據,並註冊新的算子(如更優化的join算法),同時還允許Calcite來對查詢轉化爲算子的過程進行優化。Calcite會結合用戶提供的規則和算子與系統內建規則和算子,執行基於成本的優化,生成高效的執行計劃。

編寫適配器Adapter

%emsp;%emsp;Calcite在example/csv子項目下提供了CSV的適配器。它能很好地支持應用程序的功能需求,同時如果正在編寫自己的適配器,它也能作爲一個足夠簡單的例子來作爲參考模板。
%emsp;%emsp;具體使用CSV 適配器和編寫其他適配器的方法請查看下一章節2教程。
%emsp;%emsp;幫助(HOWTO)章節提供了更多使用其他適配器的信息,和常用的使用場景。

功能狀態

%emsp;%emsp;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) 多種適配器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章