Apache Calcite簡介

文章導讀:

  1. 什么是Calcite?
  2. Calcite的主要功能?
  3. 如何快速使用Calcite?

什么是Calcite

Apache Calcite是一個動態數據管理框架,它具備很多典型數據庫管理系統的功能,比如SQL解析、SQL校驗、SQL查詢優化、SQL生成以及數據連接查詢等,但是又省略了一些關鍵的功能,比如Calcite并不存儲相關的元數據和基本數據,不完全包含相關處理數據的算法等。

也正是因為Calcite本身與數據存儲和處理的邏輯無關,所以這讓它成為與多個數據存儲位置(數據源)和多種數據處理引擎之間進行調解的絕佳選擇。

Calcite所做的工作就是將各種SQL語句解析成抽象語法樹(AST Abstract Syntax Tree),并根據一定的規則或成本對AST的算法與關系進行優化,最后推給各個數據處理引擎進行執行。

目前,使用Calcite作為SQL解析與優化引擎的又Hive、Drill、Flink、Phoenix和Storm,Calcite憑借其優秀的解析優化能力,會有越來越多的數據處理引擎采用Calcite作為SQL解析工具。

Calcite 主要功能

Calcite的主要功能我們上面其實已經提到了,主要有以下功能:

SQL解析:通過JavaCC將SQL解析成未經校驗的AST語法樹

SQL校驗:校驗分兩部分,一種為無狀態的校驗,即驗證SQL語句是否符合規范;一種為有狀態的即通過與元數據結合驗證SQL中的Schema、Field、Function是否存在。

SQL查詢優化:對上個步驟的輸出(RelNode)進行優化,得到優化后的物理執行計劃

SQL生成:將物理執行計劃生成為在特定平臺/引擎的可執行程序,如生成符合Mysql or Oracle等不同平臺規則的SQL查詢語句等

數據連接與執行:通過各個執行平臺執行查詢,得到輸出結果。

所以在Calcite中,一條SQL的處理步驟就很清晰了,那么我們通過Calcite的代碼來實際了解一下:

// 初始化配置
SqlParser.ConfigBuilder configBuilder = SqlParser.configBuilder();
configBuilder.setUnquotedCasing(Casing.UNCHANGED);
//Sql解析:解析Sql語句,通過JavaCC解析成AST語法樹,表現為SqlNode
SqlParser sqlParser = SqlParser.create(sql, configBuilder.build());
SqlNode sqlNode = sqlParser.parseQuery();
//Sql校驗:結合元數據信息驗證Sql是否符合規范
Planner planner = Frameworks.getPlanner(config);
SqlNode node = planner.validate(sqlNode);
//Sql查詢優化:將SqlNode轉換為LogicalPlan,表現為RelNode
RelRoot relRoot = planner.rel(node);
RelNode project = relRoot.project();
//指定優化規則
final HepProgram program = new HepProgramBuilder() 
    .addRuleInstance(SubQueryRemoveRule.PROJECT)
    .addRuleInstance(SubQueryRemoveRule.FILTER)
    .addRuleInstance(SubQueryRemoveRule.JOIN)
    .build();
//生成優化后的RelNode
HepPlanner prePlanner = new HepPlanner(program);
prePlanner.setRoot(project);
RelNode relNode = prePlanner.findBestExp();
//ToDo 執行查詢 

使用Calcite

那么前面對Calcite進行了簡單的介紹,我們如何使用Calcite呢?Calcite的使用非常簡單,你要做的只是添加數據源即可。我們以Mysql數據源為例,我們通過添加Mysql數據庫作為Calcite的數據源,實現通過Calcite對Mysql數據進行查詢的Demo。

//初始化calcite connection
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);
//添加mysql數據庫作為數據源
SchemaPlus rootSchema = calciteConnection.getRootSchema();
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");
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();

Calcite提供了多種方式添加數據源,如通過“inline:”的字符串方式以及通過json或yaml文件的方式。同時,Calcite抽象出了功能齊全的接口,可以方便的將CSV文件抽象成數據表進行查詢。這部分內容可以通過官方的示例了解一下!

當然SQL解析、校驗與執行計劃優化是Calcite的基本功能,Calcite的NB之處在于,Calcite的目標是“one size fits all”,希望能為不同的計算平臺和數據源提供統一的查詢引擎,并且以類似傳統數據庫的訪問方式(SQL)來訪問Hadoop上的數據。所以Calcite提供了非常豐富的可擴展接口,幫助我們實現擴展數據源、擴展針對不同數據源的優化規則、擴展SQL查詢語法、擴展數據處理引擎等等。這部分后面會詳細介紹(挖坑ing)

參考資料:
https://calcite.apache.org/docs/tutorial.html
https://www.infoq.cn/article/new-big-data-hadoop-query-engine-apache-calcite

好久不更新了

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容