tdengine学习笔记-建库和建表
目录
建库和建表
创建超级表
创建表
自动建表
创建普通表
多列模型 VS 单列模型
数据类型映射
示例程序汇总
在车联网领域的应用
1. 数据模型概述
2. 表结构设计
2.1 静态数据表
2.2 动态数据表
4. 查询数据
4.1 查询单个车辆的数据
4.2 查询多个车辆的数据
4.3 聚合查询
5. 性能优化
6. 安全性和监控
建库和建表
创建数据库
创建一个数据库以存储电表数据的 SQL 如下:
CREATE DATABASE power PRECISION 'ms' KEEP 3650 DURATION 10 BUFFER 16;
该 SQL 将创建一个名为 power
的数据库,各参数说明如下:
PRECISION 'ms'
:这个数据库的时序数据使用毫秒(ms)精度的时间戳KEEP 3650
:这个库的数据将保留 3650 天,超过 3650 天的数据将被自动删除DURATION 10
:每 10 天的数据放在一个数据文件中BUFFER 16
:写入使用大小为 16MB 的内存池。
注意:KEEP 3650这个日期影响着后面插入的时间,如果后面插入的时间戳早于这个时间将会报错
Timestamp data out of range
在创建power数据库后,可以执行 USE 语句来使用切换数据库。
use power;
该 SQL 将当前数据库切换为 power
,表示之后的插入、查询等操作,都在当前的 power
数据库中进行。
创建超级表
创建一张名为 meters
的超级表的 SQL 如下:
CREATE STABLE meters (ts timestamp, current float, voltage int, phase float
) TAGS (location varchar(64), group_id int
);
在 TDengine 中,创建超级表的 SQL 语句与关系型数据库类似。例如,上面的 SQL 中,CREATE STABLE
为关键字,表示创建超级表;接着,meters
是超级表的名称;在表名后面的括号中,定义超级表的列(列名、数据类型等),规则如下:
- 第 1 列必须为时间戳列。例如:
ts timestamp
表示,时间戳列名是t
s,数据类型为timestamp
; - 从第 2 列开始是采集量列。采集量的数据类型可以为整型、浮点型、字符串等。例如:
current float
表示,采集量电流current
,数据类型为float
;
最后,TAGS是关键字,表示标签,在 TAGS 后面的括号中,定义超级表的标签(标签名、数据类型等)。
- 标签的数据类型可以为整型、浮点型、字符串等。例如:
location varchar(64)
表示,标签地区location
,数据类型为varchar(64)
; - 标签的名称不能与采集量列的名称相同。
创建表
通过超级表创建子表 d1001
的 SQL 如下:
CREATE TABLE d1001
USING meters (location,group_id
) TAGS ("California.SanFrancisco", 2
);
上面的 SQL 中,CREATE TABLE
为关键字,表示创建表;d1001
是子表的名称;USING
是关键字,表示要使用超级表作为模版;meters
是超级表的名称;在超级表名后的括号中,location
, group_id
表示,是超级表的标签列名列表;TAGS
是关键字,在后面的括号中指定子表的标签列的值。"California.SanFrancisco"
和 2
表示子表 d1001
的位置为 California.SanFrancisco
,分组 ID 为 2
。
当对超级表进行写入或查询操作时,用户可以使用伪列 tbname 来指定或输出对应操作的子表名。
自动建表
在 TDengine 中,为了简化用户操作并确保数据的顺利写入,即使子表尚不存在,用户也可以使用带有 using 关键字的自动建表 SQL 进行数据写入。这种机制允许系统在遇到不存在的子表时,自动创建该子表,然后再执行数据写入操作。如果子表已经存在,系统则会直接写入数据,不需要任何额外的步骤。
在写入数据的同时自动建表的 SQL 如下:
INSERT INTO d1002
USING meters
TAGS ("California.SanFrancisco", 2
) VALUES (NOW, 10.2, 219, 0.32
);
上面的 SQL 中,INSERT INTO d1002
表示,向子表 d1002
中写入数据;USING meters
表示,使用超级表 meters
作为模版;TAGS ("California.SanFrancisco", 2)
表示,子表 d1002
的标签值分别为 California.SanFrancisco
和 2
;VALUES (NOW, 10.2, 219, 0.32)
表示,向子表 d1002
插入一行记录,值分别为NOW(当前时间戳)、10.2(电流)、219(电压)、0.32(相位)。在 TDengine 执行这条 SQL 时,如果子表 d1002
已经存在,则直接写入数据;当子表 d1002
不存在,会先自动创建子表,再写入数据。
创建普通表
在 TDengine 中,除了具有标签的子表以外,还存在一种不带任何标签的普通表。这类表与普通关系型数据库中的表相似,用户可以使用 SQL 创建它们。
普通表与子表的区别在于:
- 标签扩展性:子表在普通表的基础上增加了静态标签,这使得子表能够携带更多的元数据信息。此外,子表的标签是可变的,用户可以根据需要增加、删除或修改标签。
- 表归属:子表总是隶属于某张超级表,它们是超级表的一部分。而普通表则独立存在,不属于任何超级表。
- 转换限制:在 TDengine 中,普通表无法直接转换为子表,同样,子表也无法转换为普通表。这两种表类型在创建时就确定了它们的结构和属性,后期无法更改。
总结来说,普通表提供了类似于传统关系型数据库的表功能,而子表则通过引入标签机制,为时序数据提供了更丰富的描述能力和更灵活的管理方式。用户可以根据实际需求选择创建普通表还是子表。
创建不带任何标签的普通表的 SQL 如下:
CREATE TABLE d1003(ts timestamp,current float, voltage int, phase float,location varchar(64), group_id int
);
上面的 SQL 表示,创建普通表 d1003
,表结构包括 ts
、current
、voltage
、phase
、location
、group_id
,共 6 个列。这样的数据模型,与关系型数据库完全一致。
采用普通表作为数据模型意味着静态标签数据(如 location 和 group_id)会重复存储在表的每一行中。这种做法不仅增加了存储空间的消耗,而且在进行查询时,由于无法直接利用标签数据进行过滤,查询性能会显著低于使用超级表的数据模型。
多列模型 VS 单列模型
TDengine 支持灵活的数据模型设计,包括多列模型和单列模型。多列模型允许将多个由同一数据采集点同时采集且时间戳一致的物理量作为不同列存储在同一张超级表中。然而,在某些极端情况下,可能会采用单列模型,即每个采集的物理量都单独建立一张表。例如,对于电流、电压和相位这 3 种物理量,可能会分别建立 3 张超级表。
尽管 TDengine 推荐使用多列模型,因为这种模型在写入效率和存储效率方面通常更优,但在某些特定场景下,单列模型可能更为适用。例如,当一个数据采集点的采集量种类经常发生变化时,如果采用多列模型,就需要频繁修改超级表的结构定义,这会增加应用程序的复杂性。在这种情况下,采用单列模型可以简化应用程序的设计和管理,因为它允许独立地管理和扩展每个物理量的超级表。
总之,TDengine 提供了灵活的数据模型选项,用户可以根据实际需求和场景选择最适合的模型,以优化性能和管理复杂性。
数据类型映射
TDengine 目前支持时间戳、数字、字符、布尔类型,与 Java 对应类型转换如下:
TDengine DataType | JDBCType |
---|---|
TIMESTAMP | java.sql.Timestamp |
INT | java.lang.Integer |
BIGINT | java.lang.Long |
FLOAT | java.lang.Float |
DOUBLE | java.lang.Double |
SMALLINT | java.lang.Short |
TINYINT | java.lang.Byte |
BOOL | java.lang.Boolean |
BINARY | byte array |
NCHAR | java.lang.String |
JSON | java.lang.String |
VARBINARY | byte[] |
GEOMETRY | byte[] |
注意:JSON 类型仅在 tag 中支持。
由于历史原因,TDengine中的BINARY底层不是真正的二进制数据,已不建议使用。请用VARBINARY类型代替。
GEOMETRY类型是little endian字节序的二进制数据,符合WKB规范。详细信息请参考 数据类型
WKB规范请参考Well-Known Binary (WKB)
对于java连接器,可以使用jts库来方便的创建GEOMETRY类型对象,序列化后写入TDengine,这里有一个样例Geometry示例
示例程序汇总
示例程序源码位于 TDengine/docs/examples/JDBC
下:
- JDBCDemo:JDBC 示例源程序。
- connectionPools:HikariCP, Druid, dbcp, c3p0 等连接池中使用 taos-jdbcdriver。
- SpringJdbcTemplate:Spring JdbcTemplate 中使用 taos-jdbcdriver。
- mybatisplus-demo:Springboot + Mybatis 中使用 taos-jdbcdriver。
- springbootdemo: Springboot 中使用 taos-jdbcdriver。
- consumer-demo:Consumer 消费 TDengine 数据示例,可通过参数控制消费速度。
请参考:JDBC example
在车联网领域的应用
设计车联网数据在TDengine时序数据库中的表结构时,需要考虑以下几个关键因素:数据的类型、频率、存储效率以及查询性能。TDengine 是一个专为物联网(IoT)和时序数据设计的高性能时序数据库,特别适合处理大规模的时序数据。
1. 数据模型概述
车联网数据通常包括车辆的基本信息、传感器数据、位置信息等。我们可以将这些数据分为两类:
- 静态数据:车辆的基本信息,如车辆ID、车型、生产日期等。
- 动态数据:车辆运行时产生的数据,如速度、油耗、位置、温度等。
2. 表结构设计
在TDengine中,可以使用超级表(Super Table)和子表(Sub Table)来组织数据。超级表定义了数据的通用结构,而子表则存储具体设备的数据。
2.1 静态数据表
静态数据可以存储在一个单独的表中,或者作为超级表的一部分。如果静态数据变化不频繁,可以将其作为超级表的标签(Tag)。
CREATE TABLE vehicle_info (vehicle_id BINARY(32), -- 车辆IDmodel BINARY(32), -- 车型production_date TIMESTAMP, -- 生产日期PRIMARY KEY(vehicle_id)
);
2.2 动态数据表
动态数据可以使用超级表和子表来存储。超级表定义了所有子表的公共结构,子表则存储具体车辆的数据。
-- 创建超级表
CREATE STABLE vehicle_data (ts TIMESTAMP, -- 时间戳speed DOUBLE, -- 速度fuel_level DOUBLE, -- 油耗temperature DOUBLE, -- 温度latitude DOUBLE, -- 纬度longitude DOUBLE -- 经度
) TAGS (vehicle_id BINARY(32), -- 车辆IDmodel BINARY(32) -- 车型
);-- 创建子表
CREATE TABLE vehicle_001 USING vehicle_data TAGS ('vehicle_001', 'ModelA');
CREATE TABLE vehicle_002 USING vehicle_data TAGS ('vehicle_002', 'ModelB');--也可以自动建表,见上面目录自动建表
3. 插入数据
插入数据时,指定子表名称和具体的时间戳及数据值。
INSERT INTO vehicle_001 (ts, speed, fuel_level, temperature, latitude, longitude) VALUES (NOW, 60, 50, 25, 37.7749, -122.4194);
INSERT INTO vehicle_002 (ts, speed, fuel_level, temperature, latitude, longitude) VALUES (NOW, 55, 45, 22, 37.7749, -122.4194);
4. 查询数据
查询数据时,可以利用超级表的标签进行过滤和聚合。
4.1 查询单个车辆的数据
SELECT * FROM vehicle_001 WHERE ts >= NOW - 1h;
4.2 查询多个车辆的数据
SELECT * FROM vehicle_data WHERE ts >= NOW - 1h AND vehicle_id IN ('vehicle_001', 'vehicle_002');
4.3 聚合查询
SELECT vehicle_id, AVG(speed), MAX(fuel_level) FROM vehicle_data WHERE ts >= NOW - 1h GROUP BY vehicle_id;
5. 性能优化
- 分区:可以根据时间或车辆ID对数据进行分区,提高查询性能。
- 索引:虽然TDengine不支持传统的关系型数据库索引,但通过合理的设计表结构和使用标签,可以实现高效的查询。
- 数据压缩:TDengine支持多种数据压缩算法,可以有效减少存储空间。
6. 安全性和监控
- 权限管理:配置合适的用户权限,确保数据的安全性。
- 监控:定期监控数据库的性能指标,及时发现和解决问题。
相关文章:
tdengine学习笔记-建库和建表
目录 建库和建表 创建超级表 创建表 自动建表 创建普通表 多列模型 VS 单列模型 数据类型映射 示例程序汇总 在车联网领域的应用 1. 数据模型概述 2. 表结构设计 2.1 静态数据表 2.2 动态数据表 4. 查询数据 4.1 查询单个车辆的数据 4.2 查询多个…...
Django数据迁移出错,解决raise NodeNotFoundError问题
错误出现在: raise NodeNotFoundError(self.error_message, self.key, originself.origin) django.db.migrations.exceptions.NodeNotFoundError: Migration myApp.0003_alter_jobinfo_practise dependencies reference nonexistent parent node (myApp, 0002_renam…...
景联文科技:以全面数据处理服务推动AI创新与产业智能化转型
数据标注公司在人工智能领域扮演着重要角色,通过提供高质量的数据标注服务,帮助企业和组织训练和优化机器学习模型。从需求分析到数据交付,每一个步骤都需要严格把控,确保数据的质量和安全性。 景联文科技是一家专业的数据采集与标…...
MySQL学习/复习7表的内外连接
一、内连接...
Spring Cloud入门笔记2(OpenFeign)
场景: OpenFeign中集成了LoadBalancer,并简化了微服务调用,所以实际上使用该技术 技术栈:OpenFeign 步骤一:导入依赖 <!--openfeign--> <dependency><groupId>org.springframework.cloud</groupId><a…...
小程序中模拟发信息输入框,让textarea可以设置最大宽以及根据输入的内容自动变高的方式
<textarea show-confirm-bar"{{false}}" value"{{item.aValue}}" maxlength"301" placeholder"请输入" auto-height"{{true}}" bind:blur"onBlurTextarea" focus"{{true}}" bindinput"…...
学习HTML第二十九天
学习文章目录 二.单选框三.复选框 二.单选框 常用属性如下: name 属性:数据的名称,注意:想要单选效果,多个 radio 的 name 属性值要保持一致。 value 属性:提交的数据值。 checked 属性:让该单…...
汽车安全再进化 - SemiDrive X9HP 与环景影像系统 AVM 的系统整合
当今汽车工业正面临著前所未有的挑战与机遇,随著自动驾驶技术的迅速发展,汽车的安全性与性能需求日益提高。在这样的背景下,汽车 AVM(Automotive Visual Monitoring)标准应运而生,成为促进汽车智能化和安全…...
QString 转 char*问题与方法(const_cast的使用问题)
1、背景:今天有QString的变量,将QString的值传递给void func(char * ptr),于是就有了类似下面这一段离谱的代码 当时我还在想为什么var的值为空了,为什么呢。 2、原因:就是因为右边函数返回的是一个临时指针对象,给到了右边&…...
flink cdc 应用
SQLServer 1. The db history topic or its content is fully or partially missing. Please check database history topic configuration and re-execute the snapshot. 遇到了一下问题,多次尝试,最终发现是数据库大小写要一致。 Caused by: io.deb…...
MyBlog(三) -- APP的应用
文章目录 前言一、APP是什么?二、创建APP三、使用APP1. 注册app2. 添加路由3. 运行过程4. 完善视图函数5. 结果展示 总结 前言 前面我们已经学习了如何创建一个新的项目,并且配置好了项目的启动文件,成功将项目启动! 那么接下来我们的主要任务就是需要完善这个项目中应该包含…...
docker有哪些网络模式
Docker 提供了多种网络模式(Networking Modes),每种模式都有其特定的用例和优缺点。以下是 Docker 的几种主要网络模式: 1. Bridge 网络(默认) 描述:在这种模式下,Docker 创建了一…...
npoi 如何设置单元格为文本类型
ICellStyle style workbook.CreateCellStyle(); var font workbook.CreateFont(); font.FontHeightInPoints 10; //font.FontName "Arial"; font.FontName "仿宋"; style.Alignment NP…...
Vue3、Vite5、Primevue、Oxlint、Husky9 简单快速搭建最新的Web项目模板
Vue3、Vite5、Oxlint、Husky9 简单搭建最新的Web项目模板 特色进入正题创建基础模板配置API自动化导入配置组件自动化导入配置UnoCss接入Primevue接入VueRouter4配置项目全局环境变量 封装Axios接入Pinia状态管理接入Prerttier OXLint ESLint接入 husky lint-staged…...
DataStream编程模型之数据源、数据转换、数据输出
Flink之DataStream数据源、数据转换、数据输出(scala) 0.前言–数据源 在进行数据转换之前,需要进行数据读取。 数据读取分为4大部分: (1)内置数据源; 又分为文件数据源; socket…...
海康IPC接入TRTC时,从海康中获取的数据显示时色差不正确
2021/1 记录海康IPC接入TRTC时的历史日志 从海康sdk接口获取数据,进行解码 org.MediaPlayer.PlayM4.Player.T_YV12;private void setDecodeCB() {Player.getInstance().setDecodeCB(m_iPort, (nPort, data, nDataLen, nWidth, nHeight, nFrameTime, nDataType,…...
『VUE』31. 生命周期的应用(详细图文注释)
目录 在合适的时间进行操作取dom元素利用生命周期模拟网络数据发送代码示例 总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 在合适的时间进行操作 假设网页一颗果树,我们要取dom(果实),一定要在渲染完成后才能取(果实) 通常…...
Mybatis框架之建造者模式 (Builder Pattern)
MyBatis 框架中大量使用了 建造者模式 (Builder Pattern) 来构建复杂的对象,尤其是在 SQL 语句的解析、配置对象的创建以及动态 SQL 的生成 等方面。建造者模式使得 MyBatis 能够更灵活、清晰地构建对象,尤其是那些需要多步创建和配置的复杂对象。 1. 什…...
Java从入门到精通笔记篇(十三)
与流处理 ambda表达式 定义 lambda表达式不能被独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。 可将其语法用下列的方式理解 误区警示 “->”符号是由英文状态下的“-”和“>”组成的,符号之间没有空格。 lambd…...
嵌入式:STM32的启动(Startup)文件解析
相关阅读 嵌入式https://blog.csdn.net/weixin_45791458/category_12768532.html?spm1001.2014.3001.5482 启动文件(Startup File)是嵌入式系统开发中的核心组件之一,它用于初始化系统并为主程序的运行做好准备。在大多数情况下,启动文件是用汇编语言编…...
ElasticSearch学习笔记四:基础操作(二)
一、前言 上一篇文章中我们学习了ES中的基础操作,包括索引和映射,同时也学习了ES中的基础数据类型,今天我们继续学习其他的数据类型。 二、复杂数据类型 1、数组(Array) 在ES中没有特别指定数据类型,换…...
ODA-em-application.log太大处理
检查oda时发现u01使用率很高,层层排查到是em-application.log文件太大 orcl2:/u01/app/oracle/product/11.2.0.4/dbhome_1/oc4j/j2ee/OC4J_DBConsole_oda1_orcl/logoda1>du -sh * 57G em-application.log 2.2M global-application.log 92M …...
基于现金红包营销活动的开源 AI 智能名片与 S2B2C 商城小程序融合发展研究
摘要:本文深入剖析现金红包这一平台补贴的营销利器在消费场景中的多元应用,并将其与开源 AI 智能名片、S2B2C 商城小程序相融合,探讨其中蕴含的创新模式与商业价值。通过详尽解析各类现金红包的使用条件,阐述如何巧妙运用这些营销…...
远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接
前言:大家好!今天我要教你们如何在树莓派5上安装Raspberry Pi OS,并配置SSH和VNC权限。通过这些步骤,你将能够在Windows电脑上使用VNC Viewer,结合Cpolar内网穿透工具,实现长期的公网远程访问管理本地树莓派…...
React中 setState 是同步的还是异步的?调和阶段 setState 干了什么?
React中 setState 是同步的还是异步的 1. React 的 setState 是异步的2. 为什么 setState 在合成事件和生命周期函数中是异步的3. 为什么 setState 在原生事件和定时器中是同步的4. 为什么要这样设计?调和阶段是什么setState在调和阶段干了什么?总结&…...
【D3.js in Action 3 精译_040】4.4 D3 弧形图的绘制方法
当前内容所在位置: 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建(上篇) 4.1.1 D3 中的边距约定(中篇)4.1.2 坐标轴的生成(中篇) 4.1.2.1 比例尺的声明(中篇)4.1…...
C++设计模式:抽象工厂模式(风格切换案例)
抽象工厂模式(Abstract Factory)是一种创建型设计模式,其核心思想是:为一组相关或相互依赖的对象提供一个创建接口,而无需指定它们具体的类。简单来说,就是一个工厂可以生产一系列相关的对象。 我们接下来…...
搜维尔科技:Xsens随时随地捕捉,在任何环境下实时录制或捕捉
Xsens随时随地捕捉,在任何环境下实时录制或捕捉 搜维尔科技:Xsens随时随地捕捉,在任何环境下实时录制或捕捉...
爬虫基础总结 —— 附带爬取案例
Crawler —— Learning experience 数据的传输: 在OSI七层模型中,传输层为源主机和目标主机之间提供可靠的数据传输和通信服务,在该层中,有两个重要的协议—— TCP与 UDP协议。 TCP协议(传输控制协议) …...
图像处理学习笔记-20241118
文章目录 霍夫变换基本原理霍夫变换的步骤使用 OpenCV 实现直线检测示例:标准霍夫变换 示例:概率霍夫变换参数解释霍夫变换检测圆 基于GAN的样本生成GAN的基本原理基于GAN的数据增广流程实现代码示例 同态滤波(Homomorphic Filtering…...
乐清建站/优化技术基础
商人小鑫 Time Limit: 1000MS Memory limit: 65536K 题目描述 小鑫是个商人,当然商人最希望的就是多赚钱,小鑫也一样。这天,他来到了一个遥远的国度。那里有着n件商品,对于第i件商品需要付出ci的价钱才能得到。当然,对…...
免费网站建设公司/上海关键词推广
“Shift空格” 是全角和半角的切换...
web设计与应用/长沙seo就选智优营家
为jquery的ajax请求添加超时timeout时间的操作方法下面给大家介绍为jquery的ajax请求添加超时timeout时间的实例有时侯要用ajax来轮询某个服务是否可用,但是各个浏览器ajax的超时时间有可能不一样,所以希望ajax能只尝试几秒钟,然后隔几秒再次…...
青年汇网站开发公司/百度搜索一下
通常SPI通过4个引脚与外部器件相连: MISO:主设备输入/从设备输出引脚。 MOSI:主设备输出/从设备输入引脚 SCK:串口时钟,作为主设备的输出,从设备的输入 NSS:从设备选择。这是一个可选的引脚…...
请人做网站花多少钱/企业网站的推广阶段
转https://www.cnblogs.com/xinyangsdut/p/7628770.html 目标任务:爬取腾讯社招信息,需要爬取的内容为:职位名称,职位的详情链接,职位类别,招聘人数,工作地点,发布时间。 一、创建Sc…...
六安做网站/上海网站排名seo公司哪家好
轻松加载excel、txt、csv数据可能大家在学习的过程中会拿到一些带有坐标点的空间数据,那我们就想看一下这些坐标点是如何分布的,今天我们就来分享如何在ArcGIS中加载excel、txt、csv数据,文末附视频教程和练习数据。我们提供的数据分别是餐饮…...