Flux执行union与group操作后仍存两表,如何保留目标表?
解决思路与修改方案
你的问题根源在于代码中过早调用了yield(name: "result"),导致中间状态的union表被输出,同时后续处理的最终表也会被输出,所以出现了两个表。只需要调整yield的位置,让它仅输出最终处理完成的表即可。
修改后的代码
data = from(bucket: "home") |> range(start: -7d) |> filter(fn: (r) => r["_field"] == "BATTERY_CHARGE" or r["_field"] == "BATTERY_DISCHARGE") |> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value") |> map(fn: (r) => ({r with "Battery_Discharge": r.BATTERY_DISCHARGE / 12.0})) |> map(fn: (r) => ({r with "Battery_Charge": r.BATTERY_CHARGE / 12.0})) |> keep(columns: ["_time", "Battery_Charge", "Battery_Discharge"]) Discharge_Sum = data |> aggregateWindow(column: "Battery_Discharge", every: 1d, offset: -8h, fn: sum) Charge_Sum = data |> aggregateWindow(column: "Battery_Charge", every: 1d, offset: -8h, fn: sum) union(tables: [Discharge_Sum, Charge_Sum]) |> group(columns: ["_time"], mode: "by") |> sort(columns: ["Battery_Charge"]) |> fill(column: "Battery_Discharge", usePrevious: true) |> tail(n: 1) |> group() |> tail(n: 7) |> drop(fn: (column) => column =~ /^(_start|_stop|_measurement|location|region)/) |> rename(columns: {Battery_Discharge: "Battery Discharge", Battery_Charge: "Battery Charge"}) |> yield(name: "result") // 将yield移到最后,仅输出最终处理后的表
关键说明
- 原来的代码在
union之后立刻yield,会输出一份未完成整合的中间表;后续对这个流继续处理后,又会输出最终的整合表,所以出现了两个表。 - 将
yield(name: "result")移到整个处理链的末尾,就只会输出你需要的、已经完成求和、整合、过滤后的最终表,中间的union表不会被输出。 - 若你在InfluxDB的Data Explorer中操作,无需额外设置,调整
yield位置即可解决核心问题。
内容的提问来源于stack exchange,提问作者PradoEagle
相关产品推荐
相关产品推荐

