IoTDB 2.0.6 的 CQ 如何处理设备下新增时序?
结论
在 Apache IoTDB 2.0.x 的 CQ 中,应将需要聚合的传感器写成具体表达式,并在 INTO 中明确指定对应的目标路径。示例中的 max_value(*) 和 \${2}、\${3} 不能用于自动展开聚合结果并生成目标路径。
针对这三个传感器,可以这样定义:
CREATE CONTINUOUS QUERY cq1
RESAMPLE EVERY 1h
BEGIN
SELECT max_value(temperature), max_value(humidity), max_value(pressure)
INTO root.db_cq.device1(temperature_max),
root.db_cq.device1(humidity_max),
root.db_cq.device1(pressure_max)
FROM root.db.device1
GROUP BY(60s)
END
这条 CQ 会分别计算 temperature、humidity 和 pressure 在 60 秒窗口内的最大值,并将结果写入 root.db_cq.device1 下对应的 *_max 时序。IoTDB 的 CQ 文档示例也使用明确的聚合表达式和目标映射;EVERY 设置执行间隔,GROUP BY 设置聚合窗口。Apache IoTDB CQ 文档 CQ SQL 示例
为什么原语句不适用
原语句在 INTO 目标路径中使用了 \${2}、\${3} 形式的占位符。当前 2.0.x 文档要求通过 INTO 指定目标时序。文档中的 :: 占位符示例用于无聚合的原始数据查询,不能据此认为聚合结果也能动态生成传感器名。错误出现在解析器读取 INTO 路径表达式时,因此应先改用明确的目标映射,再处理动态新增时序的需求。
此外,GROUP BY(60s) 是 2.0.x 文档中的 CQ 写法。代码中的反引号不需要包围 GROUP BY,直接使用普通关键字即可。
新增传感器的处理
如果之后新增 root.db.device1.voltage,显式映射的 CQ 不会自动增加 voltage_max 目标项。管理程序可以在检测到 schema 变化后,读取该设备下的时序列表,生成包含新传感器的 CQ 定义,再删除并重建 CQ。IoTDB 文档说明,CQ 创建后不能直接修改;要更改定义,需要先删除再创建。CQ 管理说明
如果不能接受重建 CQ,也可以使用外部定时任务发现新增时序,并执行聚合和写入。具体做法取决于应用获取 schema 和提交查询的方式。仅凭题目提供的信息,无法确认 2.0.6 是否支持单个聚合 CQ 自动发现未来传感器并为其生成目标路径。因此,通配符匹配不应被视为支持动态目标映射。
注意事项
RESAMPLE EVERY 1h 表示 CQ 每小时执行一次;GROUP BY(60s) 表示聚合窗口为 60 秒。若要调整每次执行覆盖的数据时间范围,还需结合该版本 CQ 的 RANGE 选项和实际数据延迟来确定,不能仅凭这两个间隔推断覆盖范围。
备注:内容仅供参考。
