Influxdb中Select查詢請求結果涉及到的一些資料結構

HULK一線技術雜談發表於2018-12-03

女主宣言

本文將給大家介紹的是在Influxdb中Select查詢請求結果中涉及到的一些資料結構,對於Influxsql的查詢語句不太熟悉的同學,可以在先了解了解:

https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration

資料結構

1   Series

Influxdb中Select查詢請求結果涉及到的一些資料結構

Series其實就是measurement和tags的組合,tags是tag key和tag value的map.這個Tags的id是如何產生的呢,其實就是對tag key和tag value編碼到

[]byte: agkey1\0tagkey2\0...\tagvalue1\0tagvalue2\0...

具體實現定義在query/point.go中的encodeTags。

2  Row

Influxdb中Select查詢請求結果涉及到的一些資料結構

Row表示查詢結果集中的每一行, 其中的Values表示是返回的Fields的集合

3   bufFloatIterator

 

Influxdb中Select查詢請求結果涉及到的一些資料結構

bufFloatIterator相當於c裡面的連結串列元素,itr指向下一個元素的指標,buf表示當前元素,即FloatPoint型別的連結串列的迭代器。

FloatPoint

FloatPoint定義在query/point.gen.go中, 表示一條field為float型別的資料

Influxdb中Select查詢請求結果涉及到的一些資料結構

Next實現

當前Iterator的值不為空,就返回當前的buf, 當前的值為空,就返回itr.itr.Next(),即指向的下一個元素

Influxdb中Select查詢請求結果涉及到的一些資料結構


unread: iterator回退操作

Influxdb中Select查詢請求結果涉及到的一些資料結構

4   floatMergeIterator

floatMergeIterator組合了多個floatIterator

Influxdb中Select查詢請求結果涉及到的一些資料結構

因為要作merge, 這裡需要對其管理的所有Interator元素作排序,這裡用到了golang的container/heap作堆排。

因為要用golang的container/heap來管理,需要實現下面規定的介面,

Influxdb中Select查詢請求結果涉及到的一些資料結構

floatMergeIterator定義中的floatMergeHeap即實現了上面的介面,我們主要來看一下比較函式的實現,比較的其實就是FloatPoint。

Influxdb中Select查詢請求結果涉及到的一些資料結構

比較的優先順序先是FloatPoint的measurement名,然後是tagset id, 最後是time,將這個比較函式我們就可以知道.

結構

Influxdb中Select查詢請求結果涉及到的一些資料結構

Next函式的實現

一張長圖

Influxdb中Select查詢請求結果涉及到的一些資料結構

結合上面的Less函式可知,針對所有的FloatPoint, 排序的最小單位是Window(由measurement name, tagset id, time window組成),屬性同一Window的FloatPoint不再排序。如果是按升級規則遍歷,則遍歷的結果是按Window從小到大排,但同一Window內部的多條Point,時間不一定是從小到大的。

5

floatSortedMergeIterator

Influxdb中Select查詢請求結果涉及到的一些資料結構

同樣它也藉助了golang/container中的heap, 與floatMergeIterator相比它實現了全體Point的排序遍歷,我們來看一下是如何實現的;

pop函式:

Influxdb中Select查詢請求結果涉及到的一些資料結構

對所有Iterator包含的所在FloatPoint,都從排序,沒有Window的概念.

6   floatIteratorScanner

floatIteratorScanner將floatIterator的值掃描到map裡。

Influxdb中Select查詢請求結果涉及到的一些資料結構

ScanAt

在floatIterator中找滿足條件的Point, 條件是ts, name, tags均相等,實現比較簡單

Influxdb中Select查詢請求結果涉及到的一些資料結構

7   floatParallelIterator

Influxdb中Select查詢請求結果涉及到的一些資料結構

在一個單獨的goroutine裡面迴圈呼叫floatIterator.Next獲取FloatPoint,然後寫入到chan中:

Influxdb中Select查詢請求結果涉及到的一些資料結構

使用的時候,呼叫Next, 從上面的Chan中讀資料:

Influxdb中Select查詢請求結果涉及到的一些資料結構

8   floatLimitIterator

限制在每個window中讀取的Point個數

Influxdb中Select查詢請求結果涉及到的一些資料結構

next

Influxdb中Select查詢請求結果涉及到的一些資料結構

9   floatFillIterator

執行在select中的Group by time fill(...), 在當前的interval的window中,如果沒有查詢到值,則使用相應的添充規則生成相應的值

具體可參見:

group-by-time-intervals-and-fill

定義:

Influxdb中Select查詢請求結果涉及到的一些資料結構

10  floatInterruptIterator

每遍歷N條資料後,檢測下遍歷是否需要中斷

定義:

Influxdb中Select查詢請求結果涉及到的一些資料結構

Next

Influxdb中Select查詢請求結果涉及到的一些資料結構

11   floatReduceFloatIterator

對每個interval內的資料作reduce操作

定義:

Influxdb中Select查詢請求結果涉及到的一些資料結構

reduce()

返回處理後的points, 函式較長,但邏輯比較簡單

Influxdb中Select查詢請求結果涉及到的一些資料結構

Influxdb中Select查詢請求結果涉及到的一些資料結構

Influxdb中Select查詢請求結果涉及到的一些資料結構

12   CallIterator

CallIterator實現了聚合函式的Iterator: count, min, max, sum, first, last, mean, distinct,Median....主要是使用我們上面介紹的一系列的ReduceIterator,提供相應的Reducer, 實現AggregateFloat和Emit這兩個函式

13   IteratorOptions

構建Iterator時用到的一些配置選項, 包含的內容較多

定義:

Influxdb中Select查詢請求結果涉及到的一些資料結構

14  Cursor

select後會得到這個cursor,用來遍歷查詢結果

定義:

Influxdb中Select查詢請求結果涉及到的一些資料結構

Scan


Influxdb中Select查詢請求結果涉及到的一些資料結構

15   floatIteratorMapper

*IteratorMapper系列, 主要作用是遍歷cursor

定義

Influxdb中Select查詢請求結果涉及到的一些資料結構

我們來看一下Next介面, 對當前的cursor作scan來返回FloatPoint

Influxdb中Select查詢請求結果涉及到的一些資料結構

總結

以上就是Influxdb的select查詢請求結果涉及到的一些資料結構

HULK一線技術雜談

由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算資料庫大資料監控泛前端自動化測試等眾多技術領域,通過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享

原文連結:https://mp.weixin.qq.com/s/GzfNWEZ4wOOFVd8yrQpQOQ

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2222558/,如需轉載,請註明出處,否則將追究法律責任。

相關文章