日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

概述

Apache Calcite的前身是optiq,是Hive中做CBO(Cost Based Optimization, 基于成本的優(yōu)化)的一個(gè)模塊。2014年5月從Hive項(xiàng)目中獨(dú)立出來,成為Apache社區(qū)的孵化項(xiàng)目,同年9月正式改名為Apache Calcite。Calcite的作者是Julian Hyde,是數(shù)據(jù)處理與架構(gòu)方面的專家,在數(shù)據(jù)平臺方面的工作經(jīng)歷非常多,曾是Oracle、Broadbase公司SQL引擎的主要開發(fā)者、SQL Streaming公司的創(chuàng)始人和架構(gòu)師、Pentaho BI套件中OLAP部分的架構(gòu)師和主要開發(fā)者。

Apache Calcite是目前很火的一個(gè)Apache開源項(xiàng)目,其定位是動態(tài)數(shù)據(jù)管理框架。和傳統(tǒng)的DBMS系統(tǒng)比,Apache Calcite舍棄傳統(tǒng)數(shù)據(jù)庫系統(tǒng)的幾個(gè)關(guān)鍵特性,數(shù)據(jù)存儲(storage of data)、數(shù)據(jù)處理算法(algorithm to process data)、元數(shù)據(jù)倉儲(repository for storing metadata)。可以看到,Apache Calcite本身不涉及任何物理存儲信息,也不做具體的物理數(shù)據(jù)操作,而是專注在SQL解析、基于關(guān)系代數(shù)的優(yōu)化,通過擴(kuò)展的方式來對接底層存儲。

The Apache Calcite Architechure

因此,Apache Calcite可以更好的被其他項(xiàng)目集成, 能夠在異構(gòu)存儲、異構(gòu)引擎上,提供統(tǒng)一的數(shù)據(jù)管理能力,同時(shí)還支持基于關(guān)系的代數(shù)優(yōu)化器。正如Apache Calcite的設(shè)計(jì)目標(biāo)”One planner fits all” 說的那樣,我們只需要一個(gè)SQL接口,就能支持任何數(shù)據(jù)存儲、計(jì)算引擎。目前,Apache Caclcite被廣泛應(yīng)用于眾多的開源項(xiàng)目中,如Apache Drill、Apache Hive、Apache Kylin、Apache Phoenix、Apache Samza 和 Apache Flink等。

Apache Calcite的能力

Apache Calcite有幾個(gè)特性:

  1. 可擴(kuò)展:適配不同的存儲、計(jì)算引擎
  2. 查詢優(yōu)化:基于關(guān)系代數(shù),提供強(qiáng)大的優(yōu)化器
  3. 支持物化視圖
  4. 支持OLAP
  5. 支持流式查詢

強(qiáng)大的擴(kuò)展性

剛才提到,Apache Calcite本身不提供物理存儲(報(bào)錯(cuò)數(shù)據(jù)、元信息,以及數(shù)據(jù)的處理算法),這些減法,但是它提供了一個(gè)擴(kuò)展機(jī)制(schema adapter),能夠定義外部物理引擎中的table、view等信息。

Apache Calcite官網(wǎng)列出了大量adapter:

  • Cassandra adapter (calcite-cassandra)
  • CSV adapter (example/csv)
  • Druid adapter (calcite-druid)
  • Elasticsearch adapter (calcite-elasticsearch)
  • File adapter (calcite-file)
  • Geode adapter (calcite-geode)
  • InnoDB adapter (calcite-innodb)
  • JDBC adapter (part of calcite-core)
  • MongoDB adapter (calcite-mongodb)
  • OS adapter (calcite-os)
  • Pig adapter (calcite-pig)
  • redis adapter (calcite-redis)
  • Solr cloud adapter (solr-sql)
  • Spark adapter (calcite-spark)
  • Splunk adapter (calcite-splunk)
  • Eclipse Memory Analyzer (MAT) adapter (mat-calcite-plugin)
  • Apache Kafka adapter

Apache Calcite提供了強(qiáng)大的Sql Parser,支持標(biāo)準(zhǔn)SQL,并支持?jǐn)U展。另外,由于Calcite的底層優(yōu)化器是基于關(guān)系代數(shù)的,前端語言可以是SQL也可以是其他語言,比如Pig等,只需要通過Calcite的接口解析成抽象語法樹即可。目前有很多項(xiàng)目基于Apache Calcite做SQL解析、查詢優(yōu)化、數(shù)據(jù)虛擬化/數(shù)據(jù)聯(lián)邦、SQL重寫等。

 

查詢優(yōu)化

查詢優(yōu)化是Apache Calcite框架中的主要模塊之一。首先,什么是查詢優(yōu)化呢?對任意一個(gè)查詢,我們可以通過不同的算法對查詢進(jìn)行重寫,得到一個(gè)語義等價(jià)的查詢。那么查詢優(yōu)化就是在所有語義等價(jià)的查詢中,找到最優(yōu)的查詢,并完成重寫。

以下面的查詢?yōu)槔?/p>

SELECT * FROM fact 
WHERE event_date BEWEEN ? AND ?

最粗暴的方式,就是全表掃描,然后做過濾。當(dāng)然,我們可以利用屬性event_date的索引,把掃全表再過濾,變成成一個(gè)索引查詢。很明顯,第二個(gè)查詢效率要高很多。

Optimization: use index

剛才提到,查詢優(yōu)化就是在所有語義等價(jià)的查詢中,找到最優(yōu)的查詢。判斷一個(gè)查詢的優(yōu)劣,本質(zhì)就是在保證記過正確的前提下,降低成本。

優(yōu)化這部分,后面單獨(dú)寫一篇文章來展開討論,這里先不展開討論。

物化視圖

在大規(guī)模數(shù)據(jù)查詢中,物化視圖是加速查詢的核武器。

很多Calcite Adapters和基于Calcite的項(xiàng)目都支持物化視圖。例如:Cassadra就允許用戶在現(xiàn)有表的基礎(chǔ)上定義物化視圖。通過將物化視圖注冊到Calcite中,Calcite優(yōu)化器能夠?qū)υ胁樵冞M(jìn)行重寫,把對原表的查詢改寫成對物化視圖的查詢。

舉一個(gè)經(jīng)典的物化視圖實(shí)現(xiàn)查詢加速的例子,它按部門、性別統(tǒng)計(jì)出相應(yīng)的員工數(shù)量和工資總額:

CREATE MATERIALIZED VIEW emp_summary AS
SELECT deptno, gender, COUNT(*) AS c, SUM(salary) AS s
FROM emp
GROUP BY deptno, gender;

物化視圖本質(zhì)上也是數(shù)據(jù)表,所以你可以直接查詢它,比如查詢男員工人數(shù)大于 20個(gè)的部門:

SELECT deptno FROM emp_summary
WHERE gender = ‘M’ AND c > 20;

更重要的是,優(yōu)化器可以對查詢改寫,將對原表的查詢,改寫成對物化視圖的查詢。由于物化視圖數(shù)據(jù)量比原表少,一般存在緩存或內(nèi)存中,處理的數(shù)據(jù)更接近結(jié)果,所以查詢速度會大大加快。

 

比如下面這個(gè)對員工表(emp)的查詢(女性的平均工資):

SELECT deptno, AVG(salary) AS average_sal
FROM emp WHERE gender = 'F'
GROUP BY deptno;

通過Calcite優(yōu)化器,SQL被改寫成查詢物化視圖(emp_summary):

SELECT deptno, s / c AS average_sal
FROM emp_summary WHERE gender = 'F'
GROUP BY deptno;

我們可以看到,多數(shù)值的平均運(yùn)算,即先累加再除法轉(zhuǎn)化成了單個(gè)除法。

快速Demo

這里給一個(gè)Demo,讓大家樹下下Calcite的使用方式。一般來說,在Calcite中SQL的執(zhí)行分為下面幾步:

  1. SQL解析
  2. 語法校驗(yàn)
  3. 語義分析
  4. 優(yōu)化
  5. 執(zhí)行

以這個(gè)SQL作為原始SQL:

select u.id as user_id, u.name as user_name, j.company as user_company, u.age as user_age
from users u join jobs j on u.name = j.name
where u.age > 30 and j.id > 10
order by user_id

使用Calcite做SQL解析

SQL解析階段,Calcite對SQL做詞法分析,并轉(zhuǎn)換成抽象語法樹(AST),在Calcite中使用SqlNode來表示:

SQL Parse Phase

語法校驗(yàn)

因?yàn)镃alcite沒有物理存儲的元信息,需要注冊,這里通過下面的代碼,簡單注冊了兩張表:

 

有了元數(shù)據(jù)信息后,就可以做語法校驗(yàn)了,包括表、字段、函數(shù)存在性檢查,函數(shù)入?yún)⒊鰠㈩愋托r?yàn),字段類型校驗(yàn)等:

 

語義分析

語義分析階段,Calcite會將AST轉(zhuǎn)換成關(guān)系表達(dá)式,即RelNode,可以理解成最開始的邏輯執(zhí)行計(jì)劃:

 

打印出分析后的邏輯執(zhí)行計(jì)劃:

 

優(yōu)化

對語義分析生成的邏輯執(zhí)行計(jì)劃進(jìn)行優(yōu)化:

 

 

輸出優(yōu)化后的邏輯執(zhí)行計(jì)劃:

優(yōu)化后的邏輯執(zhí)行計(jì)劃

可以發(fā)現(xiàn),原來的執(zhí)行計(jì)劃是先join后過濾,而優(yōu)化后,過濾條件被下推到了TableScan之后。

 

總結(jié)

Apache Calcite是十分強(qiáng)大的開源動態(tài)數(shù)據(jù)管理系統(tǒng),舍棄傳統(tǒng)數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)存儲、元數(shù)據(jù)倉儲、數(shù)據(jù)處理算法,專注于對異構(gòu)存、算引擎提供SQL解析、優(yōu)化,瞄準(zhǔn)了海量數(shù)據(jù)背景下,單數(shù)據(jù)引擎(one size fits all)無法滿足需求,異構(gòu)存儲、異構(gòu)計(jì)算成為趨勢,提供了“one plan fits all”的解決方案。目前有很多開源項(xiàng)目在使用,國內(nèi)外大廠也都在使用。

后續(xù)會推出更多文章,深入理解Calcite的原理,以及在目前主流的項(xiàng)目中,Calcite的定位和解決的問題。

文中demo代碼:
https://gist.github.com/yuanyeex/c127c20d02c082646556847e74b4cc60

分享到:
標(biāo)簽:Apache Calcite
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定