簡體   English   中英

InfluxDB2.0:如何總結具有不規則時間間隔的多個時間序列?

[英]InfluxDB2.0: How to sum up multiple time series with irregular time interval?

TL;DR我正在使用 Influxdb v2.0 並使用 Influx 查詢語法(如在 GUI 中)。 我有多個數字 0/1 狀態系列(相同的 _field,不同的標簽),我想總結一下。 問題是狀態以不規則的時間間隔存儲在數據庫中,這意味着在任何時候都應該使用最后一個點查詢每個標簽的實際實際值。 我已經嘗試過使用'last'作為函數的aggregateWindow,但最后只是為沒有存儲點的窗口刪除表。 反正我可以總結一下嗎? 我接受任何方法(包括導出數據並使用其他語言腳本代替 lmao)。 先感謝您。


情景

我的團隊之前已經實現了一個簽入/簽出系統,其中電話號碼代表真實世界事件中的每個人,並決定使用 InfluxDB v2.0 作為數據庫(我們選擇它是為了我們可以輕松地通過 Grafana 進行監控) . 我有一個存儲簽入/簽出值點的存儲桶,所有架構都相同。 架構如下:

measurement: 'user'
tags: [phone, type]     // type is either ['normal', 'staff']
value: 0 or 1           // 0 for checking out event, 1 for checking in event

每當有人簽入該事件時,就會插入一個值為 1 的點,反之亦然,每當有人簽出該事件時,就會插入一個值為 0 的點。 請記住,如果用戶決定再次觸發 api,就像之前已經簽入並再次簽入一樣,該點可能會重復(盡管我們認為這具有相同的狀態 1)。 所以數據就像一個數字 0/1 狀態,但點的時間間隔不規則,每個電話號碼一條曲線圖。 相同的電話號碼但類型不同,對我們來說被視為不同的人。

該項目已經部署,我們的任務是對數據進行后處理。 問題是可視化整個時間的事件人口圖。 從數學的角度來看,這應該可以通過將每個人的所有狀態(0/1 線)隨時間相加來輕松解決。 我首先在 Influx 查詢中嘗試了這樣的事情:

from(bucket: "event_name")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "user")
  |> group(columns: ["type"])
  |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: true)
  |> yield()

結果看起來非常有希望,人口圖有兩種顏色,類型為 normal 和 staff。 但是仔細一看,Influx 的 sum 函數其實是對每個窗口中每個點的 _value 求和的。 這意味着對於一些沒有意義的窗口, sum 函數實際上並沒有總結數據庫中的每個人。 目標是對那些沒有點的窗口的實際 _value 求和(這些窗口的 _value 應該與最后一個點的 _value 相同,例如,就像我在晚上 7 點登記的那樣,所有的 _value 都應該是 1晚上 7 點以后的時間甚至某些窗口也沒有任何意義)。 然后我嘗試了這樣的事情:

from(bucket: "event_name")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "user")
  |> aggregateWindow(every: 1m, fn: last, createEmpty: true)
  |> fill(usePrevious: true)
  |> group(columns: ["type"])
  |> aggregateWindow(every: 1m, fn: sum)
  |> yield()

我為每個窗口使用最后一個點,然后用空的 _value 填充窗口,並使用前一個可能的點,然后再次對每個窗口的 _value 求和。 但是后來我發現last函數實際上刪除了空表,這意味着沒有點的窗口被刪除(createEmpty 是無用的)。 然后問題的范圍是我必須找到像last這樣的函數但不刪除空表。 我嘗試過reducelast一樣創建我自己的邏輯,但遺憾的是它並沒有像我想要的那樣(可能是我編碼錯了)。

如果您有任何想法,請幫忙。 非常感謝。

Nvm,我找到了解決方案,這里適用於那些處於相同情況的人,雖然在性能上不是很優雅,但這是我發現它有效的唯一查詢。

from(bucket: "event_name")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "user")
  |> aggregateWindow(every: 1m, fn: last, createEmpty: false)
  |> aggregateWindow(every: 1m, fn: mean, createEmpty: true)
  |> fill(usePrevious: true)
  |> fill(value: 0.0)
  |> group(columns: ["type"])
  |> aggregateWindow(every: 1m, fn: sum, createEmpty: false)
  |> yield(name: "population")
  1. 我首先使用last來獲得每個窗口的最新狀態(盡管last實際上刪除了空表,因此使createEmpty: true無論如何都沒用)
  2. 然后對於沒有任何點的窗口,我將meancreateEmpty: true ,以便為空窗口創建具有 null _value點。 對於那些確實有實際點的窗口, mean不應更改值應該只有每個窗口1點,因為我們用last前面。 這里使用mean目的只是為空窗口創建空點。 這里的步驟只是找到一個不做任何事情的函數,它不會刪除由createEmpty創建的空表。 僅供參考,我嘗試了許多函數,包括創建我自己的自定義函數,如reducemap但它們確實刪除了空表(甚至不允許分配 null),我什至創建了一個空函數,如fn: (tables=<-, x) => tables用於aggregateWindow窗口的fn: (tables=<-, x) => tables ,但它無論如何都會刪除空表。 所以mean是我最好的選擇,盡管副作用是我的值從 int 變為 float。
  3. 我在這里使用fill來用最后一個窗口的值替換空點。 這就是為什么我試圖將 null 分配給最后一步中空窗口中的點,而mean只能這樣做。 第二次fill用於那些應該代表 0 狀態的早期空窗口。
  4. 然后按類型groupsum它們應該是我尋找的結果

希望以后能幫助到和我一樣情況的人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM