CnosDB的数据更新和删除

在时序数据中,可能会出现一些数据错误或者异常情况,这时候就需要能够对数据进行清洗修复。如果不支持更新操作,将会变得非常困难。另外,一些业务场景可能会需要对已有数据进行调整,比如设备信息发生变化等。支持数据更新可以更灵活地满足这些需求。

功能介绍

  • 支持更新 Tag 值。
  • 支持更新 Field 值。
  • 支持删除数据。
update clause :=
UPDATE <table name> SET <assignment clause> [, ...] [<WHERE clause>]

assignment clause :=
<column name> = <column value>

delete clause :=
DELETE FROM <table name> <WHERE clause>

基本原理

由于 Tag 值与 Field 值,在存储引擎中的存储形式及位置不同,所以更新逻辑也不同。

更新 Tag 值

Tag 值在存储引擎中作为索引单独存储。所以对于 Tag 更新操作,需要更新索引。

步骤如下:

  1. 在 query 层根据 SQL 中的 tag 过滤条件,查询出符合条件的所有 series。
  2. 向所有匹配的节点发出预更新请求,检查是否会产生冲突,即原有的不同的 series 更新后成为相同的 series。如有冲突则本次 SQL 请求失败。
  3. 检查通过后,会提交实际的更新任务,此任务会在故障后重试,保证任务执行成功。
  4. 存储引擎节点在接收到更新请求后,会首先记录 UpdateSeriesKeys 类型的 WAL,然后更新索引。

执行计划(简化版)

UpdateTagValue
  Filter
    TagScan

更新 Field 值

根据 SQL 中的 WHERE 条件查询表中数据,更新 Field 值后重新插入表中,利用 tskv 表的去重特性达到更新目的。

执行计划(简化版)

TableWriter
  Projection
    Filter
      TableScan

删除数据

按 WHERE 条件过滤并删除表中的数据,只支持针对 Tag 或 Time 列的表达式。

执行流程(简化版)

DeleteFromTableTask
  Coordinate DML task on vnodes
    Vnode delete execution
      

示例演示

准备数据

ALTER DATABASE public SET ttl '1000000d';
DROP TABLE IF EXISTS dml_tbl;
CREATE TABLE IF NOT EXISTS dml_tbl(f0 BIGINT , f1 BIGINT , TAGS(t0, t1) );

INSERT dml_tbl(TIME, f0, f1, t0, t1)
VALUES
    ('1999-12-31 00:00:00.000', 111, 444, 'tag11', 'tag21'),
    ('1999-12-31 00:00:00.005', 222, 444, 'tag12', 'tag22'),
    ('1999-12-31 00:00:00.010', null, 222, 'tag12', 'tag23'),
    ('1999-12-31 00:00:10.015', 444, 111, 'tag14', 'tag24'),
    ('1999-12-31 00:00:10.020', 222, 555, 'tag14', 'tag21'),
    ('1999-12-31 00:10:00.025', 333, 555, 'tag11', 'tag22'),
    ('1999-12-31 00:10:00.030', 444, 333, 'tag11', 'tag23'),
    ('1999-12-31 01:00:00.035', 555, 222, 'tag14', 'tag24');

更新 Tag 值

UPDATE dml_tbl SET t0 = 'tag_new11', t1 = 'tag_new21' WHERE t0 = 'tag11' AND t1 = 'tag21';

  +-------------------------+-----------+-----------+-----+-----+
  | time                    | t0        | t1        | f0  | f1  |
  +-------------------------+-----------+-----------+-----+-----+
  | 1999-12-31T00:00:00     | tag_new11 | tag_new21 | 111 | 444 |
  | 1999-12-31T00:00:00.005 | tag12     | tag22     | 222 | 444 |
  | 1999-12-31T00:00:00.010 | tag12     | tag23     |     | 222 |
  | 1999-12-31T00:00:10.015 | tag14     | tag24     | 444 | 111 |
  | 1999-12-31T00:00:10.020 | tag14     | tag21     | 222 | 555 |
  | 1999-12-31T00:10:00.025 | tag11     | tag22     | 333 | 555 |
  | 1999-12-31T00:10:00.030 | tag11     | tag23     | 444 | 333 |
  | 1999-12-31T01:00:00.035 | tag14     | tag24     | 555 | 222 |
  +-------------------------+-----------+-----------+-----+-----+

更新 Field 值

UPDATE dml_tbl SET f1 = 999 WHERE t0 = 'tag14' AND time < '1999-12-31T00:00:10.020';

  +-------------------------+-----------+-----------+-----+-----+
  | time                    | t0        | t1        | f0  | f1  |
  +-------------------------+-----------+-----------+-----+-----+
  | 1999-12-31T00:00:00     | tag_new11 | tag_new21 | 111 | 444 |
  | 1999-12-31T00:00:00.005 | tag12     | tag22     | 222 | 444 |
  | 1999-12-31T00:00:00.010 | tag12     | tag23     |     | 222 |
  | 1999-12-31T00:00:10.015 | tag14     | tag24     | 444 | 999 |
  | 1999-12-31T00:00:10.020 | tag14     | tag21     | 222 | 555 |
  | 1999-12-31T00:10:00.025 | tag11     | tag22     | 333 | 555 |
  | 1999-12-31T00:10:00.030 | tag11     | tag23     | 444 | 333 |
  | 1999-12-31T01:00:00.035 | tag14     | tag24     | 555 | 222 |
  +-------------------------+-----------+-----------+-----+-----+

删除数据

public ❯ DROP TABLE IF EXISTS dml_tbl_for_delete;

public ❯ CREATE TABLE IF NOT EXISTS dml_tbl_for_delete(f0 BIGINT , f1 BIGINT , TAGS(t0, t1) );

public ❯ INSERT dml_tbl_for_delete(TIME, f0, f1, t0, t1)
VALUES
    ('1999-12-31 00:00:00.000', 111, 444, 'tag11', 'tag21'),
    ('1999-12-31 00:00:00.005', 222, 444, 'tag12', 'tag22'),
    ('1999-12-31 00:00:00.010', null, 222, 'tag12', 'tag23'),
    ('1999-12-31 00:00:10.015', 444, 111, 'tag14', 'tag24'),
    ('1999-12-31 00:00:10.020', 222, 555, 'tag14', 'tag21'),
    ('1999-12-31 00:10:00.025', 333, 555, 'tag11', 'tag22'),
    ('1999-12-31 00:10:00.030', 444, 333, 'tag11', 'tag23'),
    ('1999-12-31 01:00:00.035', 555, 222, 'tag14', 'tag24');

+-------------------------+-------+-------+-----+-----+
| time                    | t0    | t1    | f0  | f1  |
+-------------------------+-------+-------+-----+-----+
| 1999-12-31T00:00:00     | tag11 | tag21 | 111 | 444 |
| 1999-12-31T00:00:00.005 | tag12 | tag22 | 222 | 444 |
| 1999-12-31T00:00:00.010 | tag12 | tag23 |     | 222 |
| 1999-12-31T00:00:10.015 | tag14 | tag24 | 444 | 111 |
| 1999-12-31T00:00:10.020 | tag14 | tag21 | 222 | 555 |
| 1999-12-31T00:10:00.025 | tag11 | tag22 | 333 | 555 |
| 1999-12-31T00:10:00.030 | tag11 | tag23 | 444 | 333 |
| 1999-12-31T01:00:00.035 | tag14 | tag24 | 555 | 222 |
+-------------------------+-------+-------+-----+-----+

public ❯ DELETE FROM dml_tbl_for_delete WHERE t0 = 'tag14' AND time < '1999-12-31T00:00:10.020';

+-------------------------+-------+-------+-----+-----+
| time                    | t0    | t1    | f0  | f1  |
+-------------------------+-------+-------+-----+-----+
| 1999-12-31T00:00:00     | tag11 | tag21 | 111 | 444 |
| 1999-12-31T00:00:00.005 | tag12 | tag22 | 222 | 444 |
| 1999-12-31T00:00:00.010 | tag12 | tag23 |     | 222 |
| 1999-12-31T00:00:10.020 | tag14 | tag21 | 222 | 555 |
| 1999-12-31T00:10:00.025 | tag11 | tag22 | 333 | 555 |
| 1999-12-31T00:10:00.030 | tag11 | tag23 | 444 | 333 |
| 1999-12-31T01:00:00.035 | tag14 | tag24 | 555 | 222 |
+-------------------------+-------+-------+-----+-----+

使用场景和案例

在时序数据库中,通常会有一些特定的场景需要更新历史数据,以下是一些可能需要使用UPDATE、DELETE操作来更新历史数据的情况:

  1. 数据校正:有时候由于传感器误差、通信问题或其他原因,初始记录的数据可能是错误的。在这种情况下,你可能需要通过UPDATE、DELETE操作来校正历史数据,以确保存储的数据准确无误。
  2. 数据补全:有时候由于设备故障或通信问题,某些时间段内的数据可能丢失。当问题得到解决后,你可能会收到补充的数据,并希望将其更新到历史记录中。
  3. 处理异常情况:在某些特定的业务场景中,可能会出现需要更新、删除历史数据的情况,例如处理设备升级后的数据变化。

注意事项和限制

  1. 在更新 Tag 值时,尽量减少 WHERE 选择的数据量,大量的索引更新会带来性能问题。
  2. 在更新 Tag 值时,由于 CnosDB 不提供事务保证,所以要避免进行数据写入和删除操作。
  3. 在删除数据时,暂不支持复杂的条件表达式:对 time 列的过滤仅支持区间判断,不支持复杂过滤(支持 WHERE time < ‘2023-01-01T00:01:00',但不支持 WHERE time % 2 = 0)。除此之外,查询条件只能使用 time 列和 Tag 列而不能使用 Field 列。

结语

本文主要介绍了在 CnosDB 中的数据更新删除功能。包括如何更新 Tag 值和 Field 值、如何删除数据,同时介绍了基本原理并提供了相应的示例演示和使用场景案例。

如果您有任何问题或意见,欢迎提出,我们可以进一步讨论和改进相应功能。感谢阅读本文!

CnosDB简介

CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。

欢迎关注我们的社区网站:https://cn.cnosdb.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/319563.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python开源项目周排行 2024年第2周

点赞关注转发三连&#xff0c;您的支持是我的动力&#xff01; Python 趋势周报&#xff0c;按周浏览往期 GitHub,Gitee 等最热门的Python开源项目&#xff0c;入选的项目主要参考GitHub Trending,部分参考了Gitee和其他。排名不分先后&#xff0c;都是当周相对热门的项目。 …

12.3在应用层使用SPI总线

在SPI总线驱动框架中提供了一个spidev 的字符设备驱动&#xff0c;在应用层可以通过它来访问SPI总线。 应用层访问SPI总线的步骤 编写spidev设备树节点&#xff0c;在SPI总线的设备树节点下添加spidev设备的树节点&#xff0c;设备树示例如下所示&#xff1a; spidev0: spid…

《射雕三部曲》人物关系可视化及问答系统

背景&#xff1a; 该项目旨在构建一个基于图数据库和知识图谱的《射雕三部曲》人物关系可视化及问答系统。通过分析小说中的人物关系&#xff0c;将其构建成图数据库&#xff0c;并结合问答系统和数据分析技术&#xff0c;提供用户可视化的人物关系展示和相关问题的回答。 介绍…

Altium Desigenr 丝印重叠报错 规则修改1

Altium Desigenr画板时如果两个元件放的太近会变绿违反规则&#xff0c;特别实在有元器件外框同时需要减少PCB面积。两个电阻丝印紧挨报错&#xff0c;本质上不会影响但会报错。 1、首先在规则里面改小 2、如果不满足依旧报错&#xff0c;直接关闭元件放置规则&#xff0c;但…

宠物空气净化器哪个牌子好?实惠的猫用空气净化器牌子推荐

对于养猫的朋友来说&#xff0c;猫咪掉毛绝对是一个让人头痛的问题。猫毛和皮屑会飘散在空气中&#xff0c;不仅会遍布全屋的各个角落&#xff0c;而且打扫起来也麻烦&#xff0c;特别是一些清理不了的猫毛&#xff0c;甚至还可能引起人的过敏反应&#xff0c;例如咳嗽和哮喘。…

Unity组件开发--UI管理器

1.Canvas组件&#xff1a; 注意属性&#xff1a; &#xff08;1&#xff09;渲染模式是&#xff1a;屏幕空间相机 &#xff08;2&#xff09;创建一个UICamera节点&#xff0c;管理相机 &#xff08;3&#xff09;屏幕画布缩放模式 &#xff08;4&#xff09;画布下挂载两…

python使用贪心算法求最大整数问题

对于使用贪心算法的一个比较经典的问题&#xff0c;主要是为了解决最大整数的拼接问题&#xff0c;如果给定一个列表&#xff0c;这个列表中所包括的是一些非负整数&#xff0c;如果对这些整数进行组合&#xff0c;怎样才能组合出一个最大的整数&#xff0c;这里要注意一个问题…

springboot学生信息管理系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1研究背景 随着…

浅析爱泼斯坦事件 —— 弱电控制强电原理

据网络文字与视频资料&#xff0c;爱泼斯坦事件是犹太精英阶层&#xff0c;为了掌控美国国家机器为犹太利益集团服务&#xff0c;而精心设下的一个局。本文先假设这个结论成立&#xff0c;并基于此展开讨论。 我们知道&#xff0c;弱电管理强电是电气工程中的一门专门学问&…

探索未来餐饮:构建创新连锁餐饮系统的技术之旅

随着数字化时代的发展&#xff0c;连锁餐饮系统的设计和开发不再仅仅关乎订单处理&#xff0c;更是一场充满技术创新的冒险。在本文中&#xff0c;我们将深入研究连锁餐饮系统的技术实现&#xff0c;带你探索未来餐饮业的数字化美食之旅。 1. 构建强大的后端服务 在设计连锁…

P5461 赦免战俘题解

题目 现有2n2n(n≤10) 名作弊者站成一个正方形方阵等候kkksc03的发落。kkksc03决定赦免一些作弊者。他将正方形矩阵均分为4个更小的正方形矩阵&#xff0c;每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免&#xff0c;剩下3个小矩阵中&…

AI与编程学习

在C语言中&#xff0c;指针通常与字符数组或字符串打交道时会涉及到ASCII码的转换&#xff0c;而不是用于表现多位数的第一位。48这个值对应的是ASCII码表中数字字符0的编码。 如果你有一个表示多位数的字符数组&#xff0c;例如&#xff1a; c char number[] "1234&qu…

Abaqus汉化教程

用钢铁意志&#xff0c;成就不平凡人生。 今天博主整理了一下Abaqus2023汉化教程&#xff0c;希望大家学习。 第一步&#xff0c;在在菜单栏找到Abaqus CAE右键打开文件所在的位置 第二步&#xff1a;继续右键Abaqus CAE右键打开文件所在的位置 第三步&#xff1a;然后进入到…

Neo4j知识图谱(1)初识Neo4j

首先第一步是安装JDK和Neo4j&#xff0c;配置他们的环境变量&#xff0c;因为Neo4j不支持低版本JDK&#xff0c;所以要下载较新版本的。安装就在oracle官网下载。配置环境变量在之前博文有说过&#xff0c;配置完环境变量之后可以在命令行窗口查看一下JDK版本。&#xff08;最好…

webpack魔法注释-预获取/预加载模块

Webpack v4.6.0 增加了对预获取&#xff08;prefetch&#xff09;和预加载&#xff08;preload&#xff09;的支持。 在声明 import 时&#xff0c;使用下面这些内置指令&#xff0c;可以让 webpack 输出“resource hint”&#xff0c;来告知浏览器&#xff1a; prefetch&…

决策树:理解机器学习中的关键算法

决策树&#xff1a;理解机器学习中的关键算法 决策树是一种流行而强大的机器学习算法&#xff0c;它从数据中学习并模拟决策过程&#xff0c;以便对新的未知数据做出预测。由于其直观性和易理解性&#xff0c;决策树成为了分类和回归任务中的首选算法之一。在本文中&#xff0…

【信号与系统】【北京航空航天大学】实验二、连续时间系统的时域分析【MATLAB】

一、实验目的 1、掌握连续时间信号的卷积运算以及其对应的 MATLAB 实现方法&#xff1b; 2、掌握连续系统的冲激响应、阶跃响应 以及其对应的 MATLAB 实现方法&#xff1b; 3、掌握利用 MATLAB 求 LTI &#xff08;Linear Time-Invariant, 线性时不变&#xff09;系统响应的方…

[书生·浦语大模型实战营]——XTuner 大模型单卡低成本微调

1.Finetune简介 在未经过微调的pretrained LLM中&#xff0c;模型只会尽量去拟合你的输入&#xff0c;也就是说模型并没有意识到你在提问&#xff0c;因此需要微调来修正。 1.1常用的微调模式 LLM的下游应用中,增量预训练和指令跟随是经常会用到的两种的微调模式。 增量预训练…

Qt6.5示例:QDomDocument类解析XML文档和文件

01 QDomDocument介绍 QDomDocument类是用于处理XML文档的一个类。QDomDocument提供了对XML文档数据访问的一系列功能&#xff0c;主要功能包括如下&#xff1a; 解析XML文档&#xff1a;QDomDocument可以将XML文档解析为树形结构&#xff0c;每个节点都是一个QDomNode对象&…

企业网盘助力数字化教育资源库建设

教育行业数字化是适应社会发展的必然选择&#xff0c;是教育行业的未来重要发展趋势。万事开头难&#xff0c;如何在数字化时代升级转型是教育行业团队正在面临的挑战。Zoho Workdrive企业网盘深耕智慧文件管理服务&#xff0c;为教育行业量身打造集中文件管理库&#xff0c;推…