druid查詢上手總結

由於業務的須要,接觸了關於數據庫鏈接池druid的查詢,由於對於這方面的生疏,剛剛開始的時候爲了快速上手,僅僅侷限於使用。由於不多接觸大數據,對於裏面的一些概念理解不透徹走了很多的彎路,一週時間的探索,如今終於也有了一個比較正確的認識,因此在這裏開篇作一個總結。

0x00 引言

從什麼角度去理解druid其實很重要,做爲一個前端,一開始我只是把druid當成一個工具來理解,當成是一個以json爲查詢方式、鏈接數據庫的鏈接池。結合同事以前編寫的代碼,致使了我只想知道兩個重點:javascript

  1. 特定的查詢類型,相應地須要什麼樣的查詢條件組合,首先知道哪些條件是必須的,好組合起來把代碼先跑起來;
  2. 使用什麼查詢類型,會返回什麼樣的格式的數據?

因而我翻開了文檔,把要用的查詢方式(timeseries、topN、GroupBy、Time Boundary、Segment Metadata、Datasource Metadata、select、search、scan)都過了一遍,總計9種查詢,每種查詢都是不一樣的查詢條件而且返回不一樣格式的數據,毫無疑問很是崩潰……大腦很是抵觸這種記憶的方式,因而我前幾天不斷地往返於文檔和代碼之間,很是低效。html

我開始意識到我如今不能想着趕忙把需求作完,而是應該跳到一個更高的層面去理解druid,因而我帶着幾個疑問從新開始學習了一遍druid前端

  1. druid是什麼?
  2. druid到底解決了什麼問題,帶來了什麼好處?
  3. druid帶來(或實現)了什麼概念?

0x01 OLAP

首先從文檔中的概覽能夠知道,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

  • 維度(Dimension): 指的是觀察數據的一個角度,是考慮問題的一類屬性,這些屬性的集合統稱爲一個維。
  • 維的級別(Level): 對數據的觀察還存在細節程度的不一樣,在druid中通常表示爲時間的粒度(granularity),好比一秒,一分鐘,一小時,一天……
  • 度量(Measure): 度量是用來聚合分析計算的數字信息,在druid中稱爲"metrics",它能夠是存儲在數據庫中,也能夠是經過策略計算得出的。好比一篇文章的點擊數、或者是根據評論數、點擊數、轉發數計算出的熱點值

對於查詢到的數據,定義瞭如下操做緩存

  • 向下鑽取(Drill-down)/上卷(Roll-up): 改變維的層次和級別,變換分析的粒度。Roll-up在於提高維的級別或者減小維度來聚合數據,展示總覽,Drill-down反之,下降維的級別(或者稱粒度)或增長維度來查看細節。
  • 切片(slice)和切塊(dice): 當維度爲兩個時,咱們對獲取數據(查詢)的操做稱之爲切片,當維度的數量大於兩個時,咱們稱之爲切塊。
  • 旋轉(Pivoting): 變換維的方向,例如表格中的行列互換。

這時候咱們再回過頭來看druid,已經再也不茫然。分佈式

0x02 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

一段數據中包含了三個組件:

  • timestamp column: 首先它是圍繞着時間軸查詢的,因此在OLAP中的定義默認第一個維度就是timestamp
  • diamension columns: 維度列(在druid中將timestamp撇開當成一個特殊的個體,剩餘的稱之爲維度),通常爲字符串類型,用於過濾數據以及數據聚合分組的依據。(publisher、advertiser、gender、country)
  • metric columns: 度量列,一般是數值,通常用於聚合數據中的計算和聚合後的數值展示。(click, price)
數據分片

druid能夠以(數據源-時間範圍-版本號-段號)結合爲一個維度配合時間戳對數據進行切片,這樣的一個單元稱之爲段(segment)

好比咱們爲了觀察一篇文章點擊量上升的趨勢,咱們每隔一個小時灌入一次數據,所以產生了兩個分段

  • 段sampleData_2011-01-01T01:00:00:00Z_2011-01-01T02:00:00:00Z_v1_0
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
  • 段sampleData_2011-01-01T02:00:00:00Z_2011-01-01T03:00:00:00Z_v1_0
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
上卷(rollup)

如今咱們要看每一個時間段內產生的點擊量的總和。咱們假設每一個分段內,只採集了一次數據,時間點相同,基於timestamp 作一次rollup,因而產生了兩條數據,點擊數產生了一次聚合。

timestamp click
2011-01-01T01:00:00Z 4712
2011-01-01T02:00:00Z 5509

0x03 查詢(query)

咱們已經將用到的基本概念都過了一遍,如今是時候落地到查詢了。druid的原生查詢語言是JSON,固然各大開源社區的貢獻使其也支持了其餘語言的查詢,包括SQL。

druid的查詢分爲三大類,分別是聚合查詢,元數據查詢以及普通查詢

普通的查詢包括

聚合查詢

元數據查詢

咱們也不通篇過文檔了,普通的查詢沒什麼好講的,只有一個須要注意的點,那就是select在查詢大量的數據的時候,很消耗內存,若是沒有分頁的需求,能夠用scan替代。

元數據的查詢,主要不是基於業務的查詢,而是對當前表的屬性,或者是定義列的類型這一類屬性的查詢,好比xxx表中"country"是什麼類型的數據,xxx表收集數據起止時間,或者當前分段的版本是什麼之類的信息。

主要須要理解的是三種內置的聚合查詢,本質上作的操做是這樣的

  • timeseries: 時序查詢,實際上便是對數據基於時間點(timestamp)的一次上卷。適合用來看某幾個度量在一個時間段內的趨勢。排序可按時間降序或升序。
  • topN: 在時間點的基礎上,又增長了一個維度(OLAP的概念算兩個維度),進而對源數據進行切片,切片以後分別上卷,最後返回一個聚合集,你能夠指定某個指標做爲排序的依據。官方文檔稱這對比單個druid dimension 的groupBy 更高效。適合看某個維度下的時間趨勢,(好比美國和中國十年內GDP的增加趨勢比對,在這裏除了時間外國家就是另一個維度)
  • GroupBy: 適用於兩個維度以上的查詢,druid會根據維度切塊,而且分別上卷,最後返回聚合集。相對於topN而言,這是一個向下鑽取的操做,每多一個維度意味着保留更多的細節。(好比增長一個行業的維度,就能夠知道美國和中國十年內,每年不一樣行業貢獻GDP的佔比)

查詢的條件

  • DataSource 查詢的數據源
  • Filter: 對Dimension進行過濾,能夠根據狀況對幾個維度組合不一樣的filter類型(and、or、not、bound),還能夠根據須要定義javascript function進行過濾。
  • Aggregations: 指定度量在聚合時候的計算策略,例如相加、或者求平均值、又或者取最後一個值,在內置類型不知足的狀況下可使用javascript。好比某手遊中我統計了我每一局擊殺小怪數量,以及野怪的數量,經過聚合策略sum,我能知道我從開號以來擊殺了多少小怪和野怪。
  • Post Aggregations: 後聚合策略,提供了多個度量組合生成新度量的能力,主要有利於聚合計算的抽象,避免對一些指標的重複計算。舉個例子,假如我須要一個度量,是我擊殺小怪和野怪的總和,那麼,我只須要在後聚合階段計算,只須要拿小怪和野怪的數量相加一次,大大地提升了計算效率。
  • Granularities: 查詢的時間粒度,最細粒度爲秒,最大粒度爲all,提供了時間維度級別的調整並對數據進行上卷和向下鑽取的能力。
  • DimensionSpec: 提供了維度在聚合前輸出展現值定製的能力,好比在Dimension age一列中,拿到的是字符串類型的數字,我但願轉成數字類型,又或者定製一個javascript function,統一以 ${age} year old的形式展示。
  • context: 表示對當前查詢自己的一些配置,好比設置查詢超時的時間,又好比是否使用緩存,在通用的配置基礎上,每種查詢類型還有特定的配置,詳見文檔

0x04 總結

學習druid的過程,最大的收穫其實並非掌握druid自己,而是學到了他貫徹的OLAP的一些概念,從一開始的毫無所知,帶着一點線索向上探索,到慢慢知曉通篇,真是一個有趣的過程,實際上懂了OLAP,很快也能掌握其餘數據庫的查詢,真正作到了舉一反三,帶着這套思路相信很快也能上手SQL了,開心😊。但願能對你們上手起到幫助吧,共勉!

相關文章
相關標籤/搜索