InfluxDB将逗号分隔字符串拆分为多行数据的查询问题
拆分InfluxDB中逗号分隔的strategy字段为单行记录
问题背景
现有数据格式如下(strategies为逗号分隔的字符串列表):
name | strategies
test1 | strat1,strat2,strat3
test2 | strat3,strat4
需要将其转换为每行对应一个strategy的格式:
name | strategy
test1 | strat1
test1 | strat2
test1 | strat3
test2 | strat3
test2 | strat4
原代码错误分析
之前尝试用strings.split结合map和union实现,代码如下:
import "strings" import "array" union(tables: from(bucket: "views") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "views") |> filter(fn: (r) => r["_field"] == "views") |> map(fn: (r) => strings.split(v: r["strategies"], t: ",") |> array.map(fn: (x) => ({r with strategy: x}))) |> map(fn: (r) => array.from(rows: r)) )
报错原因是:map操作生成了嵌套的流对象(stream[stream]),而union函数要求传入的是数组形式的流([stream]),类型不匹配导致报错。
正确实现代码
改用flatMap函数替代map,flatMap可以直接将拆分后的数组元素展开为单独的行记录,无需额外的union操作:
import "strings" from(bucket: "views") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "views") |> filter(fn: (r) => r["_field"] == "views") |> flatMap(fn: (r) => // 拆分strategies为数组,再映射为包含strategy字段的新记录 strings.split(v: r["strategies"], t: ",") |> map(fn: (x) => ({ r with strategy: x, strategies: null // 可选:移除原strategies字段,不需要可删除此行 })) )
Grafana多选变量筛选
拆分完成后,即可结合Grafana多选变量进行过滤。如果变量selected_strategies是多选配置(返回数组),可以用以下过滤逻辑:
// 在flatMap之后添加此过滤步骤 |> filter(fn: (r) => contains(arr: ${selected_strategies}, value: r["strategy"]))
如果变量返回的是逗号分隔字符串,则用:
|> filter(fn: (r) => contains(v: ${selected_strategies}, s: r["strategy"]))
内容的提问来源于stack exchange,提问作者atultw
相关产品推荐
相关产品推荐

