如何使用Flux实现InfluxDB中数据表从Float到Integer的类型转换
InfluxDB 2 Float字段转Integer类型Flux实现方案
你之前使用的InfluxQL逻辑是通过临时表中转的方式完成字段类型全量转换,由于InfluxDB 2的1.x兼容层不支持SELECT ... INTO ...语法,你可以通过以下Flux脚本实现完全等价的效果:
前置准备
你需要先替换脚本中以下占位参数为你的实际配置:
- 你的Bucket名称:存储数据的桶名
- 你的Org名称:组织名称
- 目标measurement:本文示例为
measurement,可替换为你实际的表名 - 待转换字段名:本文示例为
value,可替换为你实际的字段名
操作步骤
- 步骤1:将原measurement的目标字段转为Integer类型,写入临时表
temp
from(bucket: "你的Bucket名称") |> range(start: -inf) // 读取该measurement的全部历史数据 |> filter(fn: (r) => r._measurement == "measurement" and r._field == "value") |> toInt() // 等价于InfluxQL中的::integer类型转换语法 |> to( bucket: "你的Bucket名称", org: "你的Org名称", measurement: "temp" )
- 步骤2:删除原measurement的所有数据
delete( bucket: "你的Bucket名称", org: "你的Org名称", predicate: (r) => r._measurement == "measurement", start: time(v: "1970-01-01T00:00:00Z"), stop: now() )
- 步骤3:将临时表
temp的转换后数据写回原measurement
from(bucket: "你的Bucket名称") |> range(start: -inf) |> filter(fn: (r) => r._measurement == "temp" and r._field == "value") |> to( bucket: "你的Bucket名称", org: "你的Org名称", measurement: "measurement" )
- 步骤4:删除临时表
temp
delete( bucket: "你的Bucket名称", org: "你的Org名称", predicate: (r) => r._measurement == "temp", start: time(v: "1970-01-01T00:00:00Z"), stop: now() )
注意:执行全量操作前请先备份对应数据,避免误操作导致数据丢失。如果数据量极大,可调整
range的时间范围分批执行转换,避免单次请求超时。如果需要同时转换多个字段,修改filter函数中的_field匹配规则即可。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

