计算通量查询中的布尔值

Counting boolean values in flux query

我有一个存储桶,其中一个字段是布尔值

我想统计每个小时的真数和假数

from(bucket: "xxx")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> window(every: 1h)
  |> filter(fn: (r) => r["_measurement"] == "xxx")
  |> filter(fn: (r) => r["_field"] == "myBoolField")
  |> group(columns: ["_stop"])

因为这是从每分钟(或多或少)运行一次的 cron 发出的,所以它会给出如下内容:

table _start              _stop            _time            _value otherfield1 otherfield2
0     2021-05-18T19:00:00 2021-05-18T20:00 2021-05-18T19:01 false  xxx         xxx
0     2021-05-18T19:00:00 2021-05-18T20:00 2021-05-18T19:02 true   xxx         xxx
0     2021-05-18T19:00:00 2021-05-18T20:00 2021-05-18T19:03 true   xxx         xxx
...
1     2021-05-18T20:00:00 2021-05-18T21:00 2021-05-18T20:01 false  xxx         xxx
1     2021-05-18T20:00:00 2021-05-18T21:00 2021-05-18T20:02 false  xxx         xxx
1     2021-05-18T20:00:00 2021-05-18T21:00 2021-05-18T20:03 false  xxx         xxx
...

现在,我想计算每个小时的总数、错误数和正确数(所以每个 table)但没有 losing/dropping 其他字段

所以我想要一个像

这样的结构
table _stop            _value nbFalse nbTrue otherfield1 otherfield2
0     2021-05-18T20:00 59     1       58     xxx         xxx
1     2021-05-18T21:00 55     4       51     xxx         xxx

我已经尝试了很多 pivot、count... 的组合,但都没有成功

据我了解,正确的做法是

  1. 删除 _start 和 _time

  2. 将 _value 复制到 nbTrue 和 nbFalse

  3. 通过 _stop 重新聚合以仅在 nbTrue 中保留 true,在 nbFalse 中保留 false

  4. 计算三列 _value、nbTrue 和 nbFalse

    |> 下降(列:[“_start”,“_time”]) |> 复制(列:“_value”,如:“nbTrue”) |> 重复(列:“_value”,如:“nbFalse”)

但我卡在了第 3 步...

没测试过,但我脑子里有类似的东西:

from(bucket: "xxx")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "xxx")
  |> filter(fn: (r) => r["_field"] == "myBoolField")
  |> aggregateWindow(
        every: 1h,
        fn: (column, tables=<-) => tables |> reduce(
            identity: {true_count: 0.0},
            fn: (r, accumulator) => ({
                true_count:
                    if r._value == true then accumulator.true_count + 1.0
                    else accumulator.true_count + 0.0
            })
        )
    )

我得到了这个 from the docs 并稍微调整了一下,我认为它应该可以满足您的需求。

@dskalec 的回答应该可以,我没有直接测试它,因为最后我需要聚合的不仅仅是布尔字段

这是我的查询,你可以看到它使用了相同的聚合+归约(我之前只是使用一个数据透视表来聚合多个字段)

from(bucket: "rt")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "xxx")

  |> pivot(
    rowKey:["_time"],
    columnKey: ["_field"],
    valueColumn: "_value"
  )

  |> window(every: 1h, createEmpty: true)

  |> reduce(fn: (r, accumulator) => ({ 
      nb: accumulator.nb + 1,
      field1: accumulator.field1 + r["field1"], //field1 is an int
      field2: if r["field2"] then accumulator.field2 + 1 else accumulator.field2, //field2 is a boolean
    }),
    identity: {nb: 0, field1: 0, field2: 0}
  )

  |> duplicate(column: "_stop", as: "_time")
  |> drop(columns: ["_start", "_stop"])