InfluxDB 2.x中用map和reduce关联measurements与fieldKeys报错求助
解决Flux查询中map函数与数组类型不匹配的错误
你遇到的这个报错核心原因很明确:findColumn返回的是数组类型,但map函数只能处理Flux的流(stream)数据,类型不匹配就触发了这个400错误。咱们直接来修正代码,同时优化字段拼接的逻辑。
修正方案及完整代码
我重构了你的字段拼接函数,用更简洁的方式处理字段拼接,同时去掉了导致类型错误的findColumn操作:
import "influxdata/influxdb/schema" import "strings" import "array" // 重构后的字段拼接函数:返回逗号分隔的field keys字符串 getFieldsForMeasure = (measureName) => { // 将field keys的流转换为数组 fieldKeyArray = schema.measurementFieldKeys(bucket: "mybucket", measurement: measureName) |> array.from() |> map(fn: (r) => r._value) // 拼接成字符串,处理空字段的情况 return if length(arr: fieldKeyArray) > 0 then strings.join(arr: fieldKeyArray, v: ",") else "" } // 主查询:遍历所有measurements并关联对应的字段列表 schema.measurements(bucket: "mybucket") |> map(fn: (r) => ({ measurement: r._value, fieldKeys: getFieldsForMeasure(measureName: r._value) })) |> yield(name: "data_dictionary")
关键调整说明
- 移除
findColumn:直接对schema.measurements返回的流数据进行map操作,完全契合map函数的输入要求,从根源解决类型不匹配问题。 - 优化字段拼接逻辑:
- 用
array.from()把field keys的流转换成数组,再通过strings.join直接拼接成逗号分隔的字符串,比原来的reduce写法更直观,还避免了原代码中字段顺序颠倒、末尾残留逗号的问题。 - 加入了空值判断,如果某个measurement没有字段,会返回空字符串而不是无效的逗号串。
- 用
如果你坚持想用reduce写法
如果习惯用reduce,可以调整拼接顺序并去掉末尾逗号,代码如下:
getFieldsForMeasure = (measureName) => schema.measurementFieldKeys(bucket: "mybucket", measurement: measureName) |> reduce( fn: (r, accumulator) => ({sum: accumulator.sum + if accumulator.sum == "" then r._value else "," + r._value}), identity: {sum: ""}, ) |> map(fn: (r) => r.sum)
这个写法会先判断累加器是否为空,避免开头出现多余逗号,最后直接返回拼接好的字符串。
内容的提问来源于stack exchange,提问作者DogEatDog
相关产品推荐
相关产品推荐

