Flux查询中如何对指定度量值做数值运算?报错及优化咨询
Flux实现SQL数值运算的问题解答
代码报错原因与修正
你的代码报错是因为Flux语法版本不兼容:旧版Flux(0.x)支持r with的记录更新语法,但新版Flux(1.x及以后)已废弃该写法,改用对象扩展运算符...来更新记录。
修正后的可运行代码:
from(bucket: "solar") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "batt_level" or r["_measurement"] == "generation") |> map(fn: (r) => { ...r, _value: if r["_measurement"] == "generation" then r._value / 3000 else r._value }) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: "mean")
注意:map函数块中需返回扩展后的对象,属性赋值使用冒号:而非等号=。
关于文档的疑问
并非文档错误,而是你查看的文档对应旧版Flux(0.x)。InfluxData官方文档会区分版本,新版文档已更新为对象扩展语法,建议确认你使用的Flux版本,匹配查看对应文档内容。
更简便的实现方式
可以通过pivot函数将_measurement转换为独立列,直接对目标列执行运算,写法更贴近SQL风格,无需if判断:
from(bucket: "solar") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "batt_level" or r["_measurement"] == "generation") |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value") |> map(fn: (r) => ({ ...r, generation: r.generation / 3000 })) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: "mean")
该方法先将batt_level和generation转为独立列,再直接对generation列做除法,逻辑更直观简洁。
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

