如何让CnosDB合并存储重复时序数据?
CnosDB v2.0.1 重复数据点合并问题及解决办法
根据CnosDB的插入语法,在v2.0.1版本中,写入相同时间戳+相同标签但不同批次字段值的数据点时,未按预期合并为单个数据点,而是生成多条记录。以下是完整测试过程及解决办法:
测试过程
1. 创建带标签的表
CREATE TABLE test ( a BIGINT, b BIGINT, c BIGINT, TAGS(id,name) );
2. 仅插入字段a的数据点
INSERT INTO test (TIME, id,a) VALUES('2023-03-28 16:00:00', '1',100); SELECT * FROM test;
查询结果:
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 100 |
3. 仅插入字段b的数据点
INSERT INTO test (TIME, id,b) VALUES('2023-03-28 16:00:00', '1',200); SELECT * FROM test;
查询结果:
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 100 | 200 |
4. 插入a(值不变)、b(值不变)、c(新值)的数据点
INSERT INTO test (TIME, id,a,b,c) VALUES('2023-03-28 16:00:00', '1',100,200,300); SELECT * FROM test;
查询结果:
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 100 | 200 | 300 |
5. 仅插入字段a(值改变)的数据点
INSERT INTO test (TIME, id,a) VALUES('2023-03-28 16:00:00', '1',110); SELECT * FROM test;
实际查询结果:
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 100 | 200 | 300 | |
| 2023-03-28T16:00:00.000000000 | 1 | 110 |
预期结果:
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 110 | 200 | 300 |
6. 插入a、b、c(值均改变)的数据点
INSERT INTO test (TIME, id,a,b,c) VALUES('2023-03-28 16:00:00', '1',120,220,320); SELECT * FROM test;
实际查询结果:
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 100 | 200 | 300 | |
| 2023-03-28T16:00:00.000000000 | 1 | 110 | 220 | 320 | |
| 2023-03-28T16:00:00.000000000 | 1 | 120 |
预期结果:
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 120 | 220 | 320 |
解决办法
CnosDB默认的INSERT是追加模式,不会自动合并相同主键(时间戳+标签)的记录。要实现更新合并效果,直接使用UPSERT语法即可:
- 若存在相同时间戳+标签的记录,更新指定字段的值,保留未指定字段的原有值
- 若不存在,执行插入操作
修正步骤5的操作
UPSERT INTO test (TIME, id,a) VALUES('2023-03-28 16:00:00', '1',110); SELECT * FROM test;
查询结果(符合预期):
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 110 | 200 | 300 |
修正步骤6的操作
UPSERT INTO test (TIME, id,a,b,c) VALUES('2023-03-28 16:00:00', '1',120,220,320); SELECT * FROM test;
查询结果(符合预期):
| time | id | name | a | b | c |
|---|---|---|---|---|---|
| 2023-03-28T16:00:00.000000000 | 1 | 120 | 220 | 320 |
CnosDB v2.0.1已原生支持UPSERT语法,替换INSERT即可实现数据点的合并更新。
内容的提问来源于Stack Exchange,提问作者Munin
相关产品推荐
相关产品推荐

