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; 工业开发也是这样。…

this关键字和static关键字

一、this关键字 关于java语言当中的this关键字&#xff1a; 1.this是一个关键字&#xff0c;翻译为&#xff1a;这个 2.this是一个引用&#xff0c;this是一个变量&#xff0c;this变量中保存了内存地址指向了了自身&#xff0c; this存储在JVM堆内存java对象内部。 3.创建…

koa2文件的上传下载功能

const Router require(“koa-router”); const upload new Router(); const bodyParser require(“koa-bodyparser”); const multer require("koa/multer"); const path require(“path”); const article require("…/utils/sql"); const { getCur…

(超详细)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…

在 C++/WinRT 中使用委托处理事件

本主题介绍了如何使用 C/WinRT 注册和撤销事件处理委托。 可以使用任何标准 C 函数类对象来处理事件。 使用 Visual Studio 添加事件处理程序&#xff08;WPF&#xff09; 一种将事件处理程序添加到项目的简便方法是使用 Visual Studio 中的 XAML 设计器用户界面 (UI)。 XAML …

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;这一直播引起外界的广泛关注。 这不禁让人与”懂车帝冬测“联想到…

成员函数中的this指针,以及为什么可以指向调用对象(帮助理解)

对于类中的成员函数&#xff0c;所有对象都访问的是同一块空间 但是到这里可能就会疑问了&#xff0c;那这不是和static静态函数一样了吗&#xff1f;为什么它有this指针呢&#xff1f; 注&#xff1a;这些操作都是编译器进行的管理&#xff0c;不同的编译器有不同的管理方式&…

Python——函数的参数

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

自动驾驶 | 决策规划岗位校招面试中常见的数学方法整理

文章目录 前言计算几何学求解方程的根无约束优化——求解函数极值 前言 前段时间&#xff0c;我mentor面试了一个决策规划方向实习的候选人&#xff0c;这个候选人是我母校的学生&#xff0c;算是我的学弟&#xff0c;跟我一个专业&#xff0c;他的老师是我学院的院长&#xf…

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;特别适合那些想要探索…

arm64上面运行armhf程序

arm64屏上跑armhf程序 起因&#xff1a;我们之前给客户的屏是armhf的&#xff0c;由于性能问题需要升级&#xff0c;现在提供给他们的屏是arm64的。 客户之前在armhf环境开发时花钱买了armhf版本的第三方的静态库使用&#xff0c; 现在升级用arm64的话又得花钱买arm64版本的库…

Go 类型系统

1、命名类型和未命名类型 命名类型&#xff1a;类型可以通过标识符来表示&#xff0c;这种类型称为命名类型。Go语言的基本类型中有20个预声明简单类型都是命名类型&#xff0c;Go语言还有一种命名类型——用户自定义类型。 未命名类型&#xff1a;一个类型由预声明类型、关键…

【促销定价】背后的算法技术 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;它们的区别…