Knoldus Inc.
3分鐘閱讀
嘿那里,作為一個技術人員有時我們必須編寫數(shù)據(jù)庫的查詢,看起來不錯,但我們不知道我們寫的查詢是句法正確的。所以在這個博客中,我們在Apache Calcite的幫助下使用測試用例來解決數(shù)據(jù)庫查詢并測試它。所以任何時候都不會浪費,讓我們討論Apache Calcite以及如何使用它來解析數(shù)據(jù)庫查詢。
介紹
Apache Calcite是一個動態(tài)數(shù)據(jù)管理框架。它甚至包含許多組成典型數(shù)據(jù)庫管理系統(tǒng)的部分。但是它省略了一些關鍵功能:數(shù)據(jù)存儲,處理數(shù)據(jù)的算法以及用于存儲元數(shù)據(jù)的存儲庫。
什么是Apache Calcite?
- SQL解析器
- SQL驗證
- 查詢優(yōu)化器
- SQL生成器
您應該了解有關Apache Calcite的一些導入事項
- Calcite不會存儲和處理數(shù)據(jù)。
- 這是在應用程序之間以及一個或多個數(shù)據(jù)存儲位置和數(shù)據(jù)處理引擎之間進行中介的絕佳選擇。
- 它也是構(gòu)建數(shù)據(jù)庫的理想基礎:只需添加數(shù)據(jù)。
- Calcite不想擁有數(shù)據(jù);它甚至沒有喜歡的數(shù)據(jù)格式。本示例使用內(nèi)存中的數(shù)據(jù)集,并使用諸如groupBy之類的運算符對其進行處理,并從linq4j庫中進行聯(lián)接。
- 它還可以處理其他數(shù)據(jù)格式的數(shù)據(jù),例如JDBC。
- Calcite使用優(yōu)化器規(guī)則將JOIN和GROUP BY操作推入源數(shù)據(jù)庫。
使用Calcite的優(yōu)勢:
以下功能已完成。
- 查詢解析器,驗證器和優(yōu)化器。
- 支持以JSON格式讀取模型。
- 許多標準函數(shù)和聚合函數(shù)。
- 針對Linq4j和JDBC后端的JDBC查詢。
- Linq4j前端。
- SQL功能:SELECT,F(xiàn)ROM(包括JOIN語法),WHERE,GROUP BY(包括GROUPING SETS),聚合函數(shù)(包括COUNT(DISTINCT…)和FILTER),HAVING,ORDER BY(包括NULLS FIRST / LAST),設置操作(UNION,INTERSECT,MINUS),子查詢(包括相關的子查詢),窗口聚合,LIMIT(語法為Postgres);SQL參考中的更多詳細信息
- 本地和遠程JDBC驅(qū)動程序;參見Avatica。
- 幾個適配器。
查詢執(zhí)行階段

Calcite的成分
目錄-定義可在SQL查詢中訪問的元數(shù)據(jù)和命名空間SQL解析器-將有效的SQL查詢解析為抽象語法樹(AST)。SQL驗證程序-根據(jù)catalog提供的元數(shù)據(jù)驗證抽象語法樹查詢優(yōu)化器-將AST轉(zhuǎn)換為邏輯計劃,進行優(yōu)化邏輯計劃,并將邏輯表達式轉(zhuǎn)換為物理計劃SQL生成器—將物理計劃轉(zhuǎn)換為SQL
Calcite目錄的用法
定義可在Calcite查詢中訪問的名稱空間。

查詢優(yōu)化
- 修剪未使用的字段
- 合并預測
- 將子查詢轉(zhuǎn)換為聯(lián)接
- 重新排序加入
- 下推投影
- 下推過濾器
使用Apache Calcite的項目
- Hive
- Drill
- Flink
- Phoniex
- Samza
- Storm
現(xiàn)在介紹如何使用Apache Calcite解析SQL查詢。
1:將此插件添加到數(shù)據(jù)庫查詢的依賴項或模塊中。
"org.apache.calcite" % "calcite-babel" % "1.21.0"
2:創(chuàng)建將查詢作為輸入的方法,返回SqlNode。在這種方法中,您必須提供如下配置:您可以選擇自己的分析器工廠)
val sqlParserConfig = CalciteParser
.configBuilder()
.setParserFactory(SqlBabelParserImpl.FACTORY)
.setConformance(SqlConformanceEnum.BABEL)
.build()
3:通過上面的配置(我以BABEL為例,您可以選擇自己的解析器工廠)
CalciteParser.create(sql, sqlParserConfig).parseQuery()
4: 現(xiàn)在,在測試案例中,只需聲明您的數(shù)據(jù)庫查詢或方法即可返回
assert(parseSql(resultedSql).isInstanceOf[SqlNode])
在其中parseSql是實際解析查詢的方法。
概述
建立SQL數(shù)據(jù)庫的框架。它已經(jīng)發(fā)展了十多年。用JAVA編寫,以前稱為Optimiser。也稱為Farrago。在2013年成為Apache項目。由Hortonworks的Julian Hyde領導。
(本文由聞數(shù)起舞翻譯自Knoldus Inc.的文章《Parsing database Query with Apache Calcite》,轉(zhuǎn)載請注明出處,原文鏈接:https://medium.com/@knoldus/parsing-database-query-with-apache-calcite-8d1567de3ffa)