溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

發(fā)布時(shí)間:2020-08-12 00:12:31 來(lái)源:ITPUB博客 閱讀:197 作者:HULK一線技術(shù)雜談 欄目:數(shù)據(jù)庫(kù)

女主宣言

本文將給大家介紹的是在Influxdb中Select查詢請(qǐng)求結(jié)果中涉及到的一些數(shù)據(jù)結(jié)構(gòu),對(duì)于Influxsql的查詢語(yǔ)句不太熟悉的同學(xué),可以在先了解了解:

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

數(shù)據(jù)結(jié)構(gòu)

1   Series

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

Series其實(shí)就是measurement和tags的組合,tags是tag key和tag value的map.這個(gè)Tags的id是如何產(chǎn)生的呢,其實(shí)就是對(duì)tag key和tag value編碼到

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

具體實(shí)現(xiàn)定義在query/point.go中的encodeTags。

2  Row

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

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

3   bufFloatIterator

 

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

bufFloatIterator相當(dāng)于c里面的鏈表元素,itr指向下一個(gè)元素的指針,buf表示當(dāng)前元素,即FloatPoint類型的鏈表的迭代器。

FloatPoint

FloatPoint定義在query/point.gen.go中, 表示一條field為float類型的數(shù)據(jù)

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

Next實(shí)現(xiàn)

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

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)


unread: iterator回退操作

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

4   floatMergeIterator

floatMergeIterator組合了多個(gè)floatIterator

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

因?yàn)橐鱩erge, 這里需要對(duì)其管理的所有Interator元素作排序,這里用到了golang的container/heap作堆排。

因?yàn)橐胓olang的container/heap來(lái)管理,需要實(shí)現(xiàn)下面規(guī)定的接口,

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

floatMergeIterator定義中的floatMergeHeap即實(shí)現(xiàn)了上面的接口,我們主要來(lái)看一下比較函數(shù)的實(shí)現(xiàn),比較的其實(shí)就是FloatPoint。

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

比較的優(yōu)先級(jí)先是FloatPoint的measurement名,然后是tagset id, 最后是time,將這個(gè)比較函數(shù)我們就可以知道.

結(jié)構(gòu)

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

Next函數(shù)的實(shí)現(xiàn)

一張長(zhǎng)圖

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

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

5

floatSortedMergeIterator

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

同樣它也借助了golang/container中的heap, 與floatMergeIterator相比它實(shí)現(xiàn)了全體Point的排序遍歷,我們來(lái)看一下是如何實(shí)現(xiàn)的;

pop函數(shù):

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

對(duì)所有Iterator包含的所在FloatPoint,都從排序,沒(méi)有Window的概念.

6   floatIteratorScanner

floatIteratorScanner將floatIterator的值掃描到map里。

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

ScanAt

在floatIterator中找滿足條件的Point, 條件是ts, name, tags均相等,實(shí)現(xiàn)比較簡(jiǎn)單

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

7   floatParallelIterator

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

在一個(gè)單獨(dú)的goroutine里面循環(huán)調(diào)用floatIterator.Next獲取FloatPoint,然后寫入到chan中:

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

使用的時(shí)候,調(diào)用Next, 從上面的Chan中讀數(shù)據(jù):

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

8   floatLimitIterator

限制在每個(gè)window中讀取的Point個(gè)數(shù)

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

next

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

9   floatFillIterator

運(yùn)行在select中的Group by time fill(...), 在當(dāng)前的interval的window中,如果沒(méi)有查詢到值,則使用相應(yīng)的添充規(guī)則生成相應(yīng)的值

具體可參見(jiàn):

group-by-time-intervals-and-fill

定義:

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

10  floatInterruptIterator

每遍歷N條數(shù)據(jù)后,檢測(cè)下遍歷是否需要中斷

定義:

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

Next

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

11   floatReduceFloatIterator

對(duì)每個(gè)interval內(nèi)的數(shù)據(jù)作reduce操作

定義:

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

reduce()

返回處理后的points, 函數(shù)較長(zhǎng),但邏輯比較簡(jiǎn)單

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

12   CallIterator

CallIterator實(shí)現(xiàn)了聚合函數(shù)的Iterator: count, min, max, sum, first, last, mean, distinct,Median....主要是使用我們上面介紹的一系列的ReduceIterator,提供相應(yīng)的Reducer, 實(shí)現(xiàn)AggregateFloat和Emit這兩個(gè)函數(shù)

13   IteratorOptions

構(gòu)建Iterator時(shí)用到的一些配置選項(xiàng), 包含的內(nèi)容較多

定義:

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

14  Cursor

select后會(huì)得到這個(gè)cursor,用來(lái)遍歷查詢結(jié)果

定義:

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

Scan


Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

15   floatIteratorMapper

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

定義

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

我們來(lái)看一下Next接口, 對(duì)當(dāng)前的cursor作scan來(lái)返回FloatPoint

Influxdb中Select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

總結(jié)

以上就是Influxdb的select查詢請(qǐng)求結(jié)果涉及到的一些數(shù)據(jù)結(jié)構(gòu)

HULK一線技術(shù)雜談

由360云平臺(tái)團(tuán)隊(duì)打造的技術(shù)分享公眾號(hào),內(nèi)容涉及云計(jì)算數(shù)據(jù)庫(kù)、大數(shù)據(jù)、監(jiān)控泛前端、自動(dòng)化測(cè)試等眾多技術(shù)領(lǐng)域,通過(guò)夯實(shí)的技術(shù)積累和豐富的一線實(shí)戰(zhàn)經(jīng)驗(yàn),為你帶來(lái)最有料的技術(shù)分享

原文鏈接:https://mp.weixin.qq.com/s/GzfNWEZ4wOOFVd8yrQpQOQ
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI