??一個schema adapter允許Calcite去讀取特定類型的數(shù)據(jù),將這些數(shù)據(jù)以一種table格式schema展示出來。
? Cassandra adapter (calcite-cassandra)
? CSV adapter (example/csv)
? Druid adapter (calcite-druid)
? Elasticsearch adapter(calcite-elasticsearch3 and calcite-elasticsearch6)
? File adapter (calcite-file)
? JDBC adapter (part of calcite-core)
? MongoDB adapter (calcite-mongodb)
? OS adapter (calcite-os)
? Pig adapter (calcite-pig)
? Solr cloud adapter (solr-sql)
? Spark adapter (calcite-spark)
? Splunk adapter (calcite-splunk)
? Eclipse Memory Analyzer (MAT) adapter (mat-calcite-plugin)
創(chuàng)新互聯(lián)建站是專業(yè)的石河子網(wǎng)站建設(shè)公司,石河子接單;提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行石河子網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
? Piglet (calcite-piglet) runs queries in a subset of Pig Latin
??許多項目和產(chǎn)品使用Apache Calcite進(jìn)行SQL解析,查詢優(yōu)化,數(shù)據(jù)虛擬化/聯(lián)邦以及物化視圖重寫。其中一些在“powered by Calcite”頁面。
??驅(qū)動程序允許您從應(yīng)用程序連接到Calcite。
? JDBC Driver(Java Doc)
?JDBC驅(qū)動程序由Avatica提供 支持。連接可以是本地或遠(yuǎn)程的(HTTP上的JSON或HTTP上的Protobuf)。
JDBC連接字符串參數(shù)
| 屬性 | 描述 |
|---|---|
| approximateDecimal | 是否可以接受DECIMAL類型上的聚合函數(shù)的近似結(jié)果 |
| approximateDistinctCount | 是否可以接受聚合函數(shù)COUNT(DISTINCT …)的近似結(jié)果 |
| approximateTopN | 是否可以接受”TopN”查詢(ORDER BY aggFun() DESC LIMIT n)的近似結(jié)果 |
| caseSensitive | 標(biāo)識符是否區(qū)分大小寫。如果未指定,則使用來自于lex的值。 |
| conformance | SQL一致性級別。值:DEFAULT(默認(rèn),類似于PRAGMATIC_2003),LENIENT,MySQL_5,ORACLE_10,ORACLE_12,PRAGMATIC_99,PRAGMATIC_2003,STRICT_92,STRICT_99,STRICT_2003,SQL_SERVER_2008。 |
| createMaterializations | Calcite是否創(chuàng)建物化的東西。默認(rèn)false |
| defaultNullCollation | 如果在查詢中既不指定NULLS FIRST也不指定NULLS LAST,應(yīng)如何對NULL值進(jìn)行排序。缺省值為HIGH,與Oracle相同,對NULL值進(jìn)行排序。 |
| druidFetch | 執(zhí)行一次SELECT查詢時,Druid適配器應(yīng)該讀取多少行。 |
| forceDecorrelate | 計劃器是否應(yīng)該盡可能地相互關(guān)聯(lián)。默認(rèn)為true。 |
| fun | 內(nèi)置函數(shù)和運算符的集合。有效值是“標(biāo)準(zhǔn)”(默認(rèn)),“oracle”,“空間”,并可以使用逗號連接組合,例如“oracle,spatial”。 |
| lex | 詞匯(關(guān)鍵字)策略。值是ORACLE(默認(rèn)),MYSQL,MYSQL_ANSI,SQL_SERVER,JAVA。 |
| materializationsEnabled | Calcite是否使用物化的東西。默認(rèn)false |
| model | JSON模型文件的URI |
| parserFactory | 解析器工廠。實現(xiàn)SqlParserImplFactory 接口的類的名稱,并且有一個公有的默認(rèn)構(gòu)造方法或者INSTANCE常量 |
| quoting | 如何引用標(biāo)識符。值是DOUBLE_QUOTE,BACK_QUOTE,BRACKET。如果未指定,則使用來自于lex的值。 |
| quotedCasing | 如何存儲使用了引號的標(biāo)識符。值是UNCHANGED, TO_UPPER, TO_LOWER。如果未指定,則使用來自于lex的值。 |
| schema | 初始化schema名稱 |
| schemaFactory | Schema工廠。實現(xiàn)SchemaFactory接口的類的名稱,并且有一個公有的默認(rèn)構(gòu)造方法或者INSTANCE常量。如果指定了model,此屬性會被忽略。 |
| schemaType | Schema類型。值必須是“MAP”(默認(rèn)值),“JDBC”或“CUSTOM”。(如果schemaFactory指定則隱式指定為CUSTOM類型)如果指定了model,此屬性會被忽略。 |
| spark | 指定是否應(yīng)將Spark用作無法推送到源系統(tǒng)的處理引擎。如果為false(默認(rèn)值),則Calcite將生成實現(xiàn)了Enumerable接口的代碼。 |
| timeZone | 時區(qū),例如“gmt-3”。默認(rèn)是JVM的時區(qū)。 |
| typeSystem | 類型系統(tǒng)。實現(xiàn)了接口RelDataTypeSystem的類的名稱,并具有公有的默認(rèn)構(gòu)造函數(shù)或INSTANCE常量。 |
| unquotedCasing | 如果標(biāo)識符未被引用,如何存儲。有效值是UNCHANGED,TO_UPPER,TO_LOWER。如果未指定,則使用來自于lex的值。 |
??如果僅僅連接到一個基于內(nèi)置shema類型的模型,不需要指定model。例如:
jdbc:calcite:schemaType=JDBC; schema.jdbcUser=SCOTT; schema.jdbcPassword=TIGER; schema.jdbcUrl=jdbc:hsqldb:res:foodmart??通過JDBC Schema適配器創(chuàng)建一個映射到foodmart數(shù)據(jù)庫的連接。
?相似的,可以連接到基于用戶定義的schema適配器的單一schema。例如:
jdbc:calcite:schemaFactory=org.apache.calcite.adapter.cassandra.CassandraSchemaFactory; schema.host=localhost; schema.keyspace=twissandra??創(chuàng)建一個連接到Cassandra適配器連接,與如下的模型文件等效:
{
"version": "1.0",
"defaultSchema": "foodmart",
"schemas": [
{
type: 'custom',
name: 'twissandra',
factory: 'org.apache.calcite.adapter.cassandra.CassandraSchemaFactory',
operand: {
host: 'localhost',
keyspace: 'twissandra'
}
}
]
}注意:
?operand部分的每個key,在連接字符串都以shema.為前綴。
??Calcite的核心模塊(calcite-core)支持SQL查詢(SELECT)和DML操作(INSERT,UPDATE,DELETE,MERGE),但不支持DDL操作,如CREATE SCHEMA或CREATE TABLE。正如我們將要看到的,DDL使存儲庫的狀態(tài)模型變得復(fù)雜,并且使得解析器更難以擴展,因此我們將DDL留在了核心之外。
?服務(wù)器模塊(calcite-server)向Calcite添加DDL支持。它擴展了SQL解析器,使用與子項目相同的機制,添加了一些DDL命令:
$ ./sqlline
sqlline version 1.3.0
> !connect jdbc:calcite:parserFactory=org.apache.calcite.sql.parser.ddl.SqlDdlParserImpl#FACTORY sa ""
> CREATE TABLE t (i INTEGER, j VARCHAR(10));
No rows affected (0.293 seconds)
> INSERT INTO t VALUES (1, 'a'), (2, 'bc');
2 rows affected (0.873 seconds)
> CREATE VIEW v AS SELECT * FROM t WHERE i > 1;
No rows affected (0.072 seconds)
> SELECT count(*) FROM v;
+---------------------+
| EXPR$0 |
+---------------------+
| 1 |
+---------------------+
1 row selected (0.148 seconds)
> !quitLinux系統(tǒng)測試通過,Windows尚不支持。
?calcite-server模塊是可選的。其目標(biāo)之一是使用簡潔的示例來展示Calcite的功能(例如物化視圖,外部表和生成列),可以從SQL命令行嘗試這些示例。所有calcite-server使用的功能都可以通過calcite-core中的API。
?如果您是子項目的作者,那么您的語法擴展名不太可能與calcite-server匹配,所以我們建議您通過擴展核心解析器來添加SQL語法擴展; 如果您需要DDL命令,則可以將calcite-server 復(fù)制粘貼到您的項目中。
?目前,存儲庫不會被持久化。在執(zhí)行DDL命令時,通過從根Schema添加和刪除可訪問的對象來修改內(nèi)存中的存儲庫 。同一SQL會話中的所有命令都將看到這些對象。您可以通過執(zhí)行相同的SQL命令腳本,在將來的會話中創(chuàng)建相同的對象。
?Calcite也可以作為數(shù)據(jù)虛擬化或聯(lián)邦服務(wù)器:Calcite管理多個外部Schema中的數(shù)據(jù),但是對于客戶端來說數(shù)據(jù)似乎都在同一個地方。Calcite選擇應(yīng)該在哪里處理,以及是否為了提高效率創(chuàng)建數(shù)據(jù)副本。calcite-server模塊是實現(xiàn)這一目標(biāo)的一個步驟; 一個行業(yè)垂直的解決方案將需要進(jìn)一步的封裝擴展(使Calcite作為服務(wù)可運行),存儲庫持久性,授權(quán)和安全性。
??還有許多其他的API可以擴展Calcite的功能。
?在本節(jié)中,我們將簡要介紹這些API,為您提供一個對可以實現(xiàn)功能的思路。要充分使用這些API,您需要閱讀其他文檔,例如接口的javadoc,并且可能需要找我們出為它們編寫的測試。
??有幾種方法可以將運算符或函數(shù)添加到Calcite中。我們將首先描述最簡單(也是最不強大的)。
?用戶自定義的函數(shù)是最簡單的(但功能最少)。它們很容易編寫(你只需編寫一個Java類并將其注冊到Schema中),但是在參數(shù)的數(shù)量和類型,解析重載函數(shù)或派生返回類型方面不提供很大的靈活性。
?如果需要這種靈活性,可能需要寫一個用戶自定義的操作符 (參見SqlOperator接口)。
如果操作符不遵守標(biāo)準(zhǔn)的SQL函數(shù)語法“ f(arg1, arg2, ...)”,那么需要擴展解析器。
在測試中有很多很好的例子:UdfTest類測試用戶自定義的函數(shù)和用戶自定義的聚合函數(shù)。
?聚合函數(shù)
?用戶自定義的聚合函數(shù)與用戶自定義的函數(shù)相似,但每個函數(shù)都有幾個對應(yīng)的Java方法,一個方法用于聚合生命周期中的每一個階段:
struct Accumulator {
final int sum;
}
Accumulator init() {
return new Accumulator(0);
}
Accumulator add(Accumulator a, int x) {
return new Accumulator(a.sum + x);
}
Accumulator merge(Accumulator a, Accumulator a2) {
return new Accumulator(a.sum + a2.sum);
}
int result(Accumulator a) {
return new Accumulator(a.sum + x);
}下面是計算列值為4和7的兩行總和的順序調(diào)用序列:
a = init() # a = {0}
a = add(a, 4) # a = {4}
a = add(a, 7) # a = {11}
return result(a) # returns 11窗口函數(shù)
?窗口函數(shù)與聚合函數(shù)類似,但是它應(yīng)用于由OVER子句而不是由GROUP BY子句收集的一組行。每個聚合函數(shù)都可以用作窗口函數(shù),但是有一些關(guān)鍵的區(qū)別。窗口函數(shù)看到的行可能是有序的,依賴于順序的窗口函數(shù)(RANK例如)不能用作聚合函數(shù)。
?另一個區(qū)別是,窗口是不相交的( non-disjoint):一個特定的行可以出現(xiàn)在多個窗口中。例如,10:37出現(xiàn)在9:00-10:00以及9:15-9:45兩個窗口。
?窗口函數(shù)是遞增計算的:當(dāng)時鐘從10:14轉(zhuǎn)動到10:15時,可能有兩行進(jìn)入窗口,三行離開。為此,窗口函數(shù)有一個額外的生命周期操作:
Accumulator remove(Accumulator a, int x) {
return new Accumulator(a.sum - x);
}??下面是計算移動總和的順序調(diào)用序列,在前兩行中,4行中的值分別為4,7,2和3:
a = init() # a = {0}
a = add(a, 4) # a = {4}
emit result(a) # emits 4
a = add(a, 7) # a = {11}
emit result(a) # emits 11
a = remove(a, 4) # a = {7}
a = add(a, 2) # a = {9}
emit result(a) # emits 9
a = remove(a, 7) # a = {2}
a = add(a, 3) # a = {5}
emit result(a) # emits 5分組窗口函數(shù)
?分組窗口函數(shù)是操作GROUP BY子句將記錄集合在一起的函數(shù)。內(nèi)置的分組窗口函數(shù)有HOP,TUMBLE和SESSION。可以通過實現(xiàn)接口SqlGroupedWindowFunction來定義其他函數(shù) 。
表函數(shù)和table macros
?用戶自定義的表函數(shù) 的定義方式與常規(guī)的用戶自定義“標(biāo)量”函數(shù)類似,但它是在查詢的FROM子句中使用。以下查詢使用一個名為Ramp的表函數(shù):
SELECT * FROM TABLE(Ramp(3, 4))??用戶定義的table macros使用與表函數(shù)相同的SQL語法,但定義不同。它們不會生成數(shù)據(jù),而是生成一個關(guān)系表達(dá)式。在查詢準(zhǔn)備過程中調(diào)用table macros,然后可以優(yōu)化它們生成的關(guān)系表達(dá)式。(Calcite使用table macros實現(xiàn)視圖)。
?TableFunctionTest類測試表函數(shù)并包含幾個有用的例子。
??假設(shè)你需要擴展Calcite的SQL語法,這樣才能兼容未來語法的變化。在項目中復(fù)制Parser.jj語法文件的副本是愚蠢的,因為語法是經(jīng)常編輯的。
?幸運的是,Parser.jj實際上是一個 Apache FreeMarker 模板,其中包含可以被替換的變量。calcite-core中的解析器使用變量的默認(rèn)值實例化模板,通常為空,但可以覆蓋。如果項目使用不同的解析器,可以提供自己的config.fmpp和parserImpls.ftl文件,并因此產(chǎn)生擴展的解析器。
?calcite-server模塊是在[ CALCITE-707 ]中創(chuàng)建的,并添加了DDL語句如CREATE TABLE,這是可以參考遵循的一個示例。另外可參照類ExtensionSqlParserTest。
??要定制解析器應(yīng)該接受的SQL擴展,請實現(xiàn) SqlConformance接口或使用枚舉SqlConformanceEnum中的某個內(nèi)置值 。
?要控制如何為外部數(shù)據(jù)庫(通常通過JDBC適配器)生成SQL,請使用SqlDialect類。方言也描述了引擎的能力,比如是否支持OFFSET和使用FETCH。
??要自定義Schema,需要實現(xiàn)SchemaFactory接口。
?在查詢準(zhǔn)備期間,Calcite會調(diào)用這個接口來找出你自定義的Schema包含的表和子Schema。在查詢中引用你自定義schema中的表時,Calcite將要求你的schema創(chuàng)建Table接口的實例 。
?該表將被包裝在 TableScan中 ,并將進(jìn)行查詢優(yōu)化過程。
??反射(Reflective)schema(ReflectiveSchema類)是一種封裝Java對象的方式,以便它作為Schema出現(xiàn)。其擁有集合值的字段將顯示為表格。
?它不是一個Schema工廠,而是一個真正的模式; 必須通過調(diào)用API來創(chuàng)建對象并將其包裝在Schema中。
?請參閱ReflectiveSchemaTest類。
??要自定義一個表格,你需要實現(xiàn)TableFactory接口。盡管Schema工廠生產(chǎn)一組命名表格,但是當(dāng)綁定到具有特定名稱的Schema(以及可選的一組額外操作數(shù)operands)時,表格工廠會生成單個表格。
修改數(shù)據(jù)
?如果你的自定義表格支持DML操作(INSERT,UPDATE,DELETE,MERGE),實現(xiàn)Table接口的同時也必須實現(xiàn)ModifiableTable接口。
流
?如果你的自定義表格支持流式查詢,實現(xiàn)Table接口的同時必須實現(xiàn) StreamableTable接口。
?參見 StreamTest 類的例子。
操作下推到自定義表格
?如果您希望將處理推到自定義表格的源系統(tǒng)上,請考慮實現(xiàn) FilterableTable 接口或 ProjectableFilterableTable接口。
?如果想要更多的控制,應(yīng)該寫一個計劃器的規(guī)則。這將允許您下推表達(dá)式,根據(jù)成本決定是否下推處理,是否下推更復(fù)雜的操作,如關(guān)聯(lián),聚合和排序。
??可以通過實現(xiàn)RelDataTypeSystem接口來自定義類型系統(tǒng)的某些方面。
關(guān)系運算符
?所有關(guān)系運算符都實現(xiàn)了RelNode接口, 并且大部分繼承自AbstractRelNode類。TableScan, TableModify, Values, ProjectFilter, Aggregate, Join, Sort, Union, Intersect, Minus, Window和 Match等核心運算符(由 SqlToRelConverter使用 ,覆蓋了常規(guī)傳統(tǒng)的關(guān)系代數(shù)) 。
?上述每一個都有一個“純”的邏輯子類,LogicalProject 等等。任何給定的適配器都會有引擎可以有效執(zhí)行操作的對應(yīng)部分; 例如,Cassandra適配器有 CassandraProject ,但是沒有CassandraJoin。
?可以定義你自己的RelNode子類來添加一個新的操作符,或者在一個特定的引擎中實現(xiàn)一個現(xiàn)有的運算符。
?為了使運算符有用且功能強大,您需要計劃器規(guī)則將其與現(xiàn)有運算符結(jié)合使用。(并提供元數(shù)據(jù),見下文)。這是代數(shù),效果是組合的:你寫了一些規(guī)則,但它們結(jié)合起來可以處理指數(shù)數(shù)量的查詢模式。
?如果可能的話,讓您的運算符成為現(xiàn)有運算符的子類; 那么可以重用或適應(yīng)其規(guī)則。更好的是,如果你的運算符是一個邏輯操作,你可以用現(xiàn)有的運算符來重寫(通過計劃器規(guī)則),盡量應(yīng)該這樣做。您將能夠重復(fù)使用這些運算符的規(guī)則,元數(shù)據(jù)和實現(xiàn),而無需額外的工作。
計劃器規(guī)則
?計劃器規(guī)則(RelOptRule類)可以將關(guān)系表達(dá)式轉(zhuǎn)換為等效的關(guān)系表達(dá)式。
?計劃器引擎有許多計劃器規(guī)則注冊并觸發(fā)它們將輸入查詢轉(zhuǎn)換為更高效的計劃。因此,計劃器規(guī)則是優(yōu)化過程的核心,但令人驚訝的是每個計劃器規(guī)則并不關(guān)心成本。計劃器引擎負(fù)責(zé)按順序發(fā)射規(guī)則,產(chǎn)生最優(yōu)計劃,但是每個規(guī)則只關(guān)心它的正確性。
?Calcite有兩個內(nèi)置的計劃器引擎: VolcanoPlanner 類使用動態(tài)編程,對窮舉搜索很有效,而 HepPlanner類則以更加固定的順序觸發(fā)一系列規(guī)則。
調(diào)用約定
?調(diào)用約定是特定數(shù)據(jù)引擎使用的協(xié)議。例如,Cassandra 引擎具有關(guān)系運算符的集合, CassandraProject,CassandraFilter等等,并且這些操作符可以被相互連接,而無需從一個格式轉(zhuǎn)換成另一種格式的數(shù)據(jù)。
?如果需要將數(shù)據(jù)從一個調(diào)用約定轉(zhuǎn)換為另一個調(diào)用約定,則Calcite使用一個稱為轉(zhuǎn)換器的特殊關(guān)系表達(dá)式子類(參見Converter類)。但是,當(dāng)然,轉(zhuǎn)換數(shù)據(jù)需要運行成本。
在計劃使用多個引擎的查詢時,Calcite根據(jù)其調(diào)用約定對關(guān)系表達(dá)式樹的區(qū)域進(jìn)行“著色”。計劃器通過觸發(fā)規(guī)則將操作推入數(shù)據(jù)源。如果引擎不支持特定操作,則規(guī)則不會觸發(fā)。有時一個操作可能發(fā)生在多個地方,最終根據(jù)成本選擇最佳方案。
?調(diào)用約定是實現(xiàn)了Convention接口,輔助接口(例如CassandraRel接口)和RelNode類的一組子類, 用于實現(xiàn)核心關(guān)系運算符(Project,F(xiàn)ilter, Aggregate等等)的一個類。
內(nèi)置SQL實現(xiàn)
?如果一個適配器沒有實現(xiàn)所有核心關(guān)系運算符,Calcite如何實現(xiàn)SQL?
?答案是一個特定的內(nèi)置調(diào)用約定EnumerableConvention。可枚舉約定的關(guān)系表達(dá)式被實現(xiàn)為“內(nèi)置”:Calcite生成Java代碼,編譯并在其自己的JVM中執(zhí)行它。可枚舉約定比運行在列式數(shù)據(jù)文件上的分布式引擎效率低,但可以實現(xiàn)所有核心關(guān)系運算符以及所有內(nèi)置的SQL函數(shù)和運算符。如果一個數(shù)據(jù)源不能實現(xiàn)一個關(guān)系運算符,則枚舉約定是一個回退。
??Calcite有一個元數(shù)據(jù)系統(tǒng),允許你定義成本函數(shù)和有關(guān)關(guān)系運算符的統(tǒng)計信息,統(tǒng)稱為元數(shù)據(jù)。每種元數(shù)據(jù)都有(通常)一種方法的接口。例如,selectivity 由RelMdSelectivity類和方法 getSelectivity(RelNode rel,RexNode predicate)定義。
?有許多內(nèi)置的元數(shù)據(jù)類型,包括collation, column origins, column uniqueness, distinct row count, distribution, explain visibility, expression lineage, max row count, node types, parallelism, percentage original rows, population size, predicates, row count, selectivity, size, table references, unique keys; 也可以自定義。
?然后,您可以提供一個元數(shù)據(jù)提供者(Provider)來計算RelNode的特定子類的元數(shù)據(jù)。元數(shù)據(jù)提供者可以處理內(nèi)置和擴展的元數(shù)據(jù)類型,以及內(nèi)置和擴展RelNode類型。在準(zhǔn)備查詢時,Calcite將所有適用的元數(shù)據(jù)提供者組合起來,并維護一個緩存,以便只計算一次給定的元數(shù)據(jù)(例如在特定Filter運算符中x > 10條件的selectivity )。
當(dāng)前文章:ApacheCalcite官方文檔中文版-進(jìn)階-1.適配器
文章起源:http://www.chinadenli.net/article46/iphjhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站設(shè)計公司、動態(tài)網(wǎng)站、微信公眾號、手機網(wǎng)站建設(shè)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)