计算通量查询中的布尔值
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... 的组合,但都没有成功
据我了解,正确的做法是
删除 _start 和 _time
将 _value 复制到 nbTrue 和 nbFalse
通过 _stop 重新聚合以仅在 nbTrue 中保留 true,在 nbFalse 中保留 false
计算三列 _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"])
我有一个存储桶,其中一个字段是布尔值
我想统计每个小时的真数和假数
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... 的组合,但都没有成功
据我了解,正确的做法是
删除 _start 和 _time
将 _value 复制到 nbTrue 和 nbFalse
通过 _stop 重新聚合以仅在 nbTrue 中保留 true,在 nbFalse 中保留 false
计算三列 _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"])