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,然后更新索引。

执行计划(简化版)

UpdateTagValueFilterTagScan

更新 Field 值

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

执行计划(简化版)

TableWriterProjectionFilterTableScan

删除数据

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

执行流程(简化版)

DeleteFromTableTaskCoordinate DML task on vnodesVnode 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用kibana来创建ElasticSearch的索引库与文档的命令

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;使用kibana来为ElasticSearch创建索引库&#x1f380;使用kibana来为ElasticSearch创建修改文档 &#x1f412;个人主页 &#x1f3c5;JavaEE系列专栏 &#x1f4d6;前言…

VSCode 正则表达式 匹配多行

VS Code 正则表达式匹配多行 (.|\n)*? //test.js const test {str: VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code …

代码随想录算法训练营day7|454.四数相加II 、383.赎金信、15.三数之和、18.四数之和

454.四数相加II 建议&#xff1a;本题是 使用map 巧妙解决的问题&#xff0c;好好体会一下 哈希法 如何提高程序执行效率&#xff0c;降低时间复杂度&#xff0c;当然使用哈希法 会提高空间复杂度&#xff0c;但一般来说我们都是舍空间 换时间&#xff0c; 工业开发也是这样。…

(超详细)2-YOLOV5改进-添加SimAM注意力机制

1、在yolov5/models下面新建一个SimAM.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import torch import torch.nn as nnclass SimAM(torch.nn.Module):def __init__(self, e_lambda1e-4):super(SimAM, self).__init__()self.activaton nn.Sigmoid()self…

STM32 1位共阳极数码管

数码管分为共阳极和共阴极&#xff0c;即多个二极管的同一端接到GND/Vss&#xff08;若一起接到GND&#xff0c;则称为共阴极。若一起接到Vss&#xff0c;则称为共阳极&#xff09; 把数码管上的每个二极管一次标号对应a,b,c,d,e,f,g,dp。我们知道发光二极管一端正一端负&#…

WSDM 2024 Oral | 港大提出DiffKG:融合知识图谱与扩散模型,为推荐系统赋能

论文链接&#xff1a; https://arxiv.org/abs/2312.16890 代码链接&#xff1a; https://github.com/HKUDS/DiffKG 实验室链接&#xff1a; https://sites.google.com/view/chaoh TLDR 知识图谱已成为提升推荐系统性能的重要资源&#xff0c;能提供丰富的事实信息并揭示实体间的…

问界又“翻车”了? 新能源电池“怕冷”成短板

文 | AUTO芯球 作者 | 李欣 2023年12月17日&#xff0c;蔚来创始人李斌亲自下场&#xff01;驾驶ET7从上海出发&#xff0c;经过超14小时的行驶后&#xff0c;达成一块电池行驶超过1000公里的成绩&#xff0c;这一直播引起外界的广泛关注。 这不禁让人与”懂车帝冬测“联想到…

Python——函数的参数

1.位置参数 位置参数可以在函数中设置一个或者多个参数&#xff0c;但是必须有对应个数的值传入该函数才能成功调用&#xff0c;例如&#xff1a; def power(x):return x*xprint(powr(5)) 如果传入的值与对应函数设置的位置参数不符合&#xff0c;则会报错&#xff1a; Traceba…

test-02-test case generate 测试用例生成 EvoSuite 介绍

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 拓展阅读 自动生成测试用例 什么…

用LM Studio:2分钟在本地免费部署大语言模型,替代ChatGPT

你想在本地使用类似ChatGPT 的大语言模型么&#xff1f;LM Studio 可以帮你2分钟实现ChatGPT的功能&#xff0c;而且可以切换很多不同类型的大语言模型&#xff0c;同时支持在Windows和MAC上的PC端部署。 LM Studio是一款面向开发者的友好工具&#xff0c;特别适合那些想要探索…

【促销定价】背后的算法技术 2 - 数据预处理生成

【促销定价】背后的算法技术 2 - 数据预处理生成 01 数据探查02 数据清洗03 数据聚合04 数据补全05 小结参考文献 导读&#xff1a;在日常生活中&#xff0c;我们经常会遇见线上/线下商家推出各类打折、满减、赠品、新人价、优惠券、捆绑销售等促销活动。一次成功的促销对于消费…

python -- pyQt5中 样式设置

一、父控件设置样式表后对子控件产生影响&#xff0c;控制styleSheet的作用范围 https://blog.csdn.net/qq_31073871/article/details/90288625 QFrame 作为容器&#xff0c;放入其他多种部件&#xff0c;里面的边框都生效 在类名后面用 #号串接变量名&#xff0c;子控件不…

Required request parameter ‘ids‘ for method parameter type List is not present]

在写delete方法的时候&#xff0c;出现了bug 于是将RequestParam换成PathVariable 两者有何区别&#xff1f; pathVariable和RequestParam的区别 在Spring MVC框架中&#xff0c;PathVariable 和 RequestParam 是两种用于从HTTP请求中获取参数的注解&#xff0c;它们的区别…

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

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

2024最新外贸建站:SiteGround主机购买使用及自建外贸独立站教程

原文来源&#xff1a;https://guomuyu.com/building-website-siteground.html 在开始之前&#xff0c;让我们先了解一下什么是外贸独立站。外贸独立站简单来说就是一个拥有独立域名的网站&#xff0c;它不依赖于第三方平台&#xff08;如阿里巴巴、亚马逊等&#xff09;的网站…

Python--闭包

在 Python 中&#xff0c;闭包是一种函数&#xff0c;它能够记住并访问其所在词法作用域&#xff08;即定义该函数的作用域&#xff09;中的变量&#xff0c;即使该函数在其词法作用域之外被调用。要形成闭包&#xff0c;需要满足以下几个条件&#xff1a; 必须有一个内嵌函数&…

网页设计与网站建设作业html+css+js,一个简易的游戏官网网页

一个简易的游戏网页 浏览器查看 目录结构 部分代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

重学Java 5 idea详细使用和运算符

慢点跑&#xff0c;前面的路不好走 ——24.1.14 一、IDEA的使用 1.idea的介绍 1.概述&#xff1a;开发工具 2.特点&#xff1a; a、idea是java写的&#xff0c;所以本地上必须有正确的jdk环境 b、idea自动保存 c、不用我们打开dos命令窗口执行javac和java命令 d、idea有强大的…

Mnajora 使用deb包安装软件

说明 Mnajora 安装deb软件包主要有两种方式 可以使用dpkg 直接安装也可是使用debtap将deb软件包转换成 使用dpkg sudo pacman -S dpkg #安装dpkgsudo dpkg -i ###.deb #使用dpkg安装deb软件包和在ubuntu上是一样的 安装成功 使用debtap debtap是一个用于将.deb包转换为A…

第 2 课 ROS 系统安装和环境搭建

文章目录 方法一&#xff1a;一键安装&#xff08;推荐&#xff09;方法二&#xff1a;逐步安装&#xff08;常规安装方式&#xff09;1.版本选择2.检查 Ubuntu 的软件和更新源3.设置 ROS 的下载源3.1 设置国内下载源3.2 设置公匙3.3 更新软件包 4. 安装 ROS5. 设置环境变量6. …