由於業務的須要,接觸了關於數據庫鏈接池druid的查詢,由於對於這方面的生疏,剛剛開始的時候爲了快速上手,僅僅侷限於使用。由於不多接觸大數據,對於裏面的一些概念理解不透徹走了很多的彎路,一週時間的探索,如今終於也有了一個比較正確的認識,因此在這裏開篇作一個總結。
從什麼角度去理解druid其實很重要,做爲一個前端,一開始我只是把druid當成一個工具來理解,當成是一個以json爲查詢方式、鏈接數據庫的鏈接池。結合同事以前編寫的代碼,致使了我只想知道兩個重點:javascript
因而我翻開了文檔,把要用的查詢方式(timeseries、topN、GroupBy、Time Boundary、Segment Metadata、Datasource Metadata、select、search、scan)都過了一遍,總計9種查詢,每種查詢都是不一樣的查詢條件而且返回不一樣格式的數據,毫無疑問很是崩潰……大腦很是抵觸這種記憶的方式,因而我前幾天不斷地往返於文檔和代碼之間,很是低效。html
我開始意識到我如今不能想着趕忙把需求作完,而是應該跳到一個更高的層面去理解druid,因而我帶着幾個疑問從新開始學習了一遍druid前端
首先從文檔中的概覽能夠知道,druid是一款高性能、面向列的分佈式存儲,專門爲實時數據和歷史數據提供亞秒級別的查詢而設計。主要用於統計數據的商業智能(OLAP)查詢,而且可以支持快速的多維過濾,特設屬性分組,以及極快的聚合。java
其次須要瞭解一個關鍵詞OLAP,我的理解druid是對OLAP的具體實現,概念來自於此。數據庫
聯機分析處理OLAP是一種軟件技術,它使分析人員可以迅速、一致、交互地從各個方面觀察信息,以達到深刻理解數據的目的。它具備FASMI(Fast Analysis of Shared Multidimensional Information),即共享多維信息的快速分析的特徵。其中F是快速性(Fast),指系統能在數秒內對用戶的多數分析要求作出反應;A是可分析性(Analysis),指用戶無需編程就能夠定義新的專門計算,將其做爲分析的一部 分,並以用戶所但願的方式給出報告;M是多維性(Multi—dimensional),指提供對數據分析的多維視圖和分析;I是信息性(Information),指能及時得到信息,而且管理大容量信息。 -- 百度百科
其實很好理解,當面對龐大的數據要作分析的時候,觀察一些局部瑣碎的點實際上沒有太大的意義,咱們應該要總結一套高效通用的方法去分析,好比分時間點的數據採集,以及對數據的進行聚合,去研究趨勢,而OLAP定義了一整套這樣便於分析的體系。編程
對於數據,咱們把它當成是個多維度的超立方體,分析者能夠經過不一樣的維度觀察數據。json
對於查詢到的數據,定義瞭如下操做緩存
這時候咱們再回過頭來看druid,已經再也不茫然。分佈式
如今咱們返回來看druid數據,全部的查詢都圍繞時間的維度。工具
timestamp | publisher | advertiser | gender | country | click | price |
---|---|---|---|---|---|---|
2011-01-01T01:01:35Z | bieberfever.com | google.com | Male | USA | 0 | 0.65 |
2011-01-01T01:03:63Z | bieberfever.com | google.com | Male | USA | 0 | 0.62 |
2011-01-01T01:04:51Z | bieberfever.com | google.com | Male | USA | 1 | 0.45 |
2011-01-01T01:00:00Z | ultratrimfast.com | google.com | Female | UK | 0 | 0.87 |
2011-01-01T02:00:00Z | ultratrimfast.com | google.com | Female | UK | 0 | 0.99 |
2011-01-01T02:00:00Z | ultratrimfast.com | google.com | Female | UK | 1 | 1.53 |
一段數據中包含了三個組件:
druid能夠以(數據源-時間範圍-版本號-段號)結合爲一個維度配合時間戳對數據進行切片,這樣的一個單元稱之爲段(segment)
好比咱們爲了觀察一篇文章點擊量上升的趨勢,咱們每隔一個小時灌入一次數據,所以產生了兩個分段
timestamp | publisher | advertiser | gender | country | click |
---|---|---|---|---|---|
2011-01-01T01:00:00Z | ultratrimfast.com | google.com | Male | USA | 1800 |
2011-01-01T01:00:00Z | bieberfever.com | google.com | Male | USA | 2912 |
timestamp | publisher | advertiser | gender | country | click |
---|---|---|---|---|---|
2011-01-01T02:00:00Z | ultratrimfast.com | google.com | Male | USA | 2200 |
2011-01-01T02:00:00Z | bieberfever.com | google.com | Male | USA | 3309 |
如今咱們要看每一個時間段內產生的點擊量的總和。咱們假設每一個分段內,只採集了一次數據,時間點相同,基於timestamp 作一次rollup,因而產生了兩條數據,點擊數產生了一次聚合。
timestamp | click |
---|---|
2011-01-01T01:00:00Z | 4712 |
2011-01-01T02:00:00Z | 5509 |
咱們已經將用到的基本概念都過了一遍,如今是時候落地到查詢了。druid的原生查詢語言是JSON,固然各大開源社區的貢獻使其也支持了其餘語言的查詢,包括SQL。
druid的查詢分爲三大類,分別是聚合查詢,元數據查詢以及普通查詢
普通的查詢包括
聚合查詢
元數據查詢
咱們也不通篇過文檔了,普通的查詢沒什麼好講的,只有一個須要注意的點,那就是select在查詢大量的數據的時候,很消耗內存,若是沒有分頁的需求,能夠用scan替代。
元數據的查詢,主要不是基於業務的查詢,而是對當前表的屬性,或者是定義列的類型這一類屬性的查詢,好比xxx表中"country"是什麼類型的數據,xxx表收集數據起止時間,或者當前分段的版本是什麼之類的信息。
主要須要理解的是三種內置的聚合查詢,本質上作的操做是這樣的
查詢的條件
${age} year old
的形式展示。學習druid的過程,最大的收穫其實並非掌握druid自己,而是學到了他貫徹的OLAP的一些概念,從一開始的毫無所知,帶着一點線索向上探索,到慢慢知曉通篇,真是一個有趣的過程,實際上懂了OLAP,很快也能掌握其餘數據庫的查詢,真正作到了舉一反三,帶着這套思路相信很快也能上手SQL了,開心😊。但願能對你們上手起到幫助吧,共勉!