迁移至Apache IoTDB 1.0.0后原查询报301错误的原因排查
解决Apache IoTDB 0.13.2迁移至1.0.0后聚合查询301错误的方案
错误原因分析
301: Declared positions (X) does not match column 0's number of entries (Y)这个错误,核心是IoTDB 1.0.0对设备级聚合的空值填充逻辑做了调整:
- 0.13.2版本中,当设备在查询时间段内无目标测点数据时,聚合结果会自动忽略该设备;
- 1.0.0版本默认会为这类无数据的设备填充
null值,但你的原查询语句未适配这种空值返回的格式,导致结果集的行数(positions)和预期的列条目数不匹配。
无需修改原查询的解决方法
1. 全局配置调整
在iotdb-engine.properties中修改以下参数,让1.0.0兼容0.13.2的聚合行为:
# 关闭设备级聚合时的空值填充,仅返回有数据的设备结果 enable_null_in_device_level_aggregate=false
修改后重启IoTDB服务,原查询即可正常执行。
2. 会话级临时设置
如果不想修改全局配置,可以在执行原查询前,先执行会话级参数设置语句(无需改动原查询,只需在查询前追加执行):
SET 'enable_null_in_device_level_aggregate' = 'false';
之后再执行你的原聚合查询,就能得到和0.13.2版本一致的结果格式。
验证方式
执行一个简单的设备级聚合测试查询,对比修改参数前后的结果行数:
- 修改前:返回行数等于查询范围内的设备总数(包含无数据设备);
- 修改后:返回行数等于有目标测点数据的设备数,和0.13.2的行为完全一致。
内容的提问来源于stack exchange,提问作者Hester Tso
相关产品推荐
相关产品推荐

