使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(10)

简介: 物联网提供限制/限制条款和偏移/偏移子句,以使用户对查询结果有更多的控制权。使用 LIMIT 和 SLIMIT 子句允许用户控制查询结果的行数和列数,使用 OFFSET 和 SOFSET 子句允许用户设置结果的起始位置进行显示。

所有参数的详细说明见表3-5。

表 3-5 线性填充参数列表

参数名称(不区分大小写) 解释
路径,前缀路径 查询路径;必填项
T 查询时间戳(只能指定一个);必填项
data_type 填充方法使用的数据类型。可选值为 int32、int64、浮点型、双精度型、布尔值、文本;可选字段
before_range, after_range 表示线性方法的有效时间范围。当存在 [T-before_range, T+after_range] 范围内的值时,前一种方法有效。如果未显式指定before_range和after_range,则使用 default_fill_interval。-1 表示无穷大;可选字段

请注意,如果时间序列在查询时间戳 T 处具有有效值,则此值将用作线性填充值。否则,如果在 [T-before_range,T] 或 [T, T + after_range] 范围内没有有效的填充值,则线性填充方法将返回 null。

在这里,我们给出了使用线性方法填充空值的示例。SQL 语句如下:

  1. select temperature from root.sgcc.wf03.wt01 wheretime= 2017-11-01T16:37:50.000 fill(float [linear, 1m, 1m])

这意味着:

因为时间序列根.sgcc.wf03.wt01.temperature在2017-11-01T16:37:50.000为空,系统使用之前的时间戳2017-11-01T16:37:00.000(时间戳在[2017-11-01T16:36:50.000,2017-11-01T16:37:50.000]时间范围内)及其值21.927326,下一个时间戳2017-11-01T16:38:00.000(时间戳在[2017-11-01T16:37:50.000,2017-11-01T16:38:50.000]时间范围内)及其值25.311783进行线性拟合计算: 21.927326 + (25.311783-21.927326)/60s * 50s = 24.747707

此语句的执行结果如下所示:

数据类型和填充方法之间的对应关系

数据类型和支持的填充方法如表 3-6 所示。

表 3-6 数据类型和支持的填充方法**

数据类型 支持的填充方法
布尔 以前
国际特32 上一篇, 线性
国际特64 上一篇, 线性
上一篇, 线性
上一篇, 线性
发短信 以前

值得注意的是,对于数据类型不支持的填充方法,IoTDB 会给出错误提示,如下所示:

如果未指定 fill 方法,则每种数据类型都有自己的默认填充方法和参数。相应的关系如表3-7所示。

表 3-7 各种数据类型的默认填充方法和参数**

数据类型 默认填充方法和参数
布尔 前一页, 600000
国际特32 前一页, 600000
国际特64 前一页, 600000
前一页, 600000
前一页, 600000
发短信 前一页, 600000

注意:在 0.7.0 版中,至少应在 Fill 语句中指定一个填充方法。

对查询结果的行和列控制

物联网提供限制/限制条款和偏移/偏移子句,以使用户对查询结果有更多的控制权。使用 LIMIT 和 SLIMIT 子句允许用户控制查询结果的行数和列数,使用 OFFSET 和 SOFSET 子句允许用户设置结果的起始位置进行显示。

请注意,分组依据查询不支持 LIMIT 和 OFFSET。

本章主要介绍查询结果行列控制的相关示例。您还可以使用Java JDBC用于执行查询的标准接口。

对查询结果的行控制

通过使用 LIMIT 和 OFFSET 子句,用户可以以与行相关的方式控制查询结果。我们将通过以下示例演示如何使用 LIMIT 和 OFFSET 子句。

  • 示例 1:基本限制子句

SQL 语句为:

  1. selectstatus, temperature from root.ln.wf01.wt01 limit10

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列为“状态”和“温度”。SQL 语句要求返回查询结果的前 10 行。

结果如下所示:

  • 示例 2:带偏移的 LIMIT 子句

SQL 语句为:

  1. selectstatus, temperature from root.ln.wf01.wt01 limit5offset3

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列为“状态”和“温度”。SQL 语句要求返回查询结果的第 3 行到第 7 行(第一行编号为第 0 行)。

结果如下所示:

  • 示例 3:限制子句与 WHERE 子句的组合

SQL 语句为:

  1. selectstatus,temperature from root.ln.wf01.wt01 wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit2offset3

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列为“状态”和“温度”。SQL 语句要求返回“3-4-2017T11:01:00.05”和“00-000-2017T11:01:00.12”之间的状态和温度传感器值的第 00 行到第 000 行(第一行编号为第 0 行)。

结果如下所示:

  • 示例 4:LIMIT 子句与 GROUP BY 子句的组合

SQL 语句为:

  1. selectcount(status), max_value(temperature) from root.ln.wf01.wt01 group by ([2017-11-01T00:00:00, 2017-11-07T23:00:00),1d)limit5offset3

这意味着:

SQL 语句子句要求返回查询结果的第 3 行到第 7 行(第一行编号为第 0 行)。

结果如下所示:

值得注意的是,由于目前的 FILL 子句只能填充某个时间点的时间序列缺失值,也就是说 FILL 子句的执行结果正好是一行,所以 LIMIT 和 OFFSET 预计不会与 FILL 子句结合使用,否则会提示错误。例如,执行以下 SQL 语句:

  1. select temperature from root.sgcc.wf03.wt01 wheretime= 2017-11-01T16:37:50.000 fill(float[previous, 1m])limit10

SQL 语句将不会执行,相应的错误提示如下:

对查询结果的列控制

通过使用 SLIMIT 和 SOFFSET 子句,用户可以以与列相关的方式控制查询结果。我们将通过以下示例演示如何使用 SLIMIT 和 SOFFSET 子句。

  • 示例 1:基本 SLIMIT 子句

SQL 语句为:

  1. select * fromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000slimit1

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列是此设备下的第一列,即电源状态。SQL 语句要求选择时间点“2017-11-01T00:05:00.000”和“2017-11-01T00:12:00.000”之间的状态传感器值。

结果如下所示:

  • 示例 2:带有偏移量的 SLIMIT 子句

SQL 语句为:

  1. select * fromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000slimit1soffset1

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列是该设备下的第二列,即温度。SQL 语句要求选择时间点“2017-11-01T00:05:00.000”和“2017-11-01T00:12:00.000”之间的温度传感器值。

结果如下所示:

  • 示例 3:SLIMIT 子句与 GROUP BY 子句的组合

SQL 语句为:

  1. select max_value(*) from root.ln.wf01.wt01 group by ([2017-11-01T00:00:00, 2017-11-07T23:00:00),1d) slimit 1 soffset 1

结果如下所示:

  • 示例 4:SLIMIT 子句与 FILL 子句的组合

SQL 语句为:

  1. select * from root.sgcc.wf03.wt01 wheretime= 2017-11-01T16:37:50.000 fill(float[previous, 1m]) slimit 1 soffset 1

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列是该设备下的第二列,即温度。

结果如下所示:

值得注意的是,SLIMIT 子句预计会与星号路径或前缀路径结合使用,当 SLIMIT 子句与完整路径查询结合使用时,系统会提示错误。例如,执行以下 SQL 语句:

  1. selectstatus,temperaturefromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000slimit1

SQL 语句将不会执行,相应的错误提示如下:

对查询结果的行和列控制

除了对查询结果进行行或列控制外,IoTDB 还允许用户控制查询结果的行和列。下面是一个包含 LIMIT 子句和 SLIMIT 子句的完整示例。

SQL 语句为:

  1. select * from root.ln.wf01.wt01 limit10offset100 slimit 2 soffset 0

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列是此设备下的第 0 到 1 列(第一列编号为 0 列)。SQL 语句子句要求返回查询结果的第 100 到 109 行(第一行编号为第 0 行)。

结果如下所示:

其他结果集格式

此外,IoTDB 还支持另外两种结果集格式:“按设备对齐”和“禁用对齐”。

“按设备对齐”表示将设备 ID 视为一列。因此,数据集中的列完全有限。

SQL 语句为:

  1. select s1,s2 from root.sg1.*GROUPBY DEVICE

有关更多语法说明,请阅读 SQL 参考。

“禁用对齐”表示结果集中每个时间序列有 3 列。有关更多语法说明,请阅读 SQL 参考。

错误处理

当 LIMIT/SLIMIT 的参数 N/SN 超过结果集大小时,IoTDB 将按预期返回所有结果。例如,原始 SQL 语句的查询结果由六行组成,我们通过 LIMIT 子句选择前 100 行:

  1. selectstatus,temperature from root.ln.wf01.wt01 wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit100

结果如下所示:

当 LIMIT/SLIMIT 子句的参数 N/SN 超过允许的最大值(N/SN 的类型为 int32)时,系统将提示错误。例如,执行以下 SQL 语句:

  1. selectstatus,temperature from root.ln.wf01.wt01 wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit1234567890123456789

SQL 语句将不会执行,相应的错误提示如下:

当 LIMIT/SLIMIT 子句的参数 N/SN 不是正向时,系统将提示错误。例如,执行以下 SQL 语句:

  1. selectstatus,temperaturefromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit13.1

SQL 语句将不会执行,相应的错误提示如下:

当 LIMIT 子句的参数 OFFSET 超过结果集的大小时,IoTDB 将返回一个空的结果集。例如,执行以下 SQL 语句:

  1. selectstatus,temperature from root.ln.wf01.wt01 wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit2offset6

结果如下所示:

当SLIMIT子句的参数SOFFSET不小于可用时间序列的数量时,系统将提示错误。例如,执行以下 SQL 语句:

  1. select * fromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000slimit1soffset2

SQL 语句将不会执行,相应的错误提示如下:

删除

用户可以删除指定时间序列中满足删除条件的数据,方法是使用删除语句.删除数据时,用户可以选择一个或多个时间序列路径、前缀路径或带星号的路径删除特定时间之前的数据(当前版本不支持在封闭时间间隔内删除数据)。

在 JAVA 编程环境中,您可以使用Java JDBC以执行单个或批处理 UPDATE 语句。

删除单个时间序列

以ln集团为例,存在这样的使用场景:

wf02工厂的wt02设备在2017-11-01 16:26:00之前电源状态存在多段错误,无法正确分析数据。错误数据影响了与其他设备的相关性分析。此时,需要删除此时间点之前的数据。此操作的 SQL 语句为

  1. delete from root.ln.wf02.wt02.status wheretime<=2017-11-01T16:26:00;

删除多个时间序列

当02-02-2017 11:01:16之前的ln组wf26工厂wt00设备的电源状态和硬件版本都需要删除时,具有更广泛含义的前缀路径或具有星号的路径可用于删除数据。此操作的 SQL 语句为:

  1. delete from root.ln.wf02.wt02 wheretime<= 2017-11-01T16:26:00;

  1. delete from root.ln.wf02.wt02.* wheretime<= 2017-11-01T16:26:00;

需要注意的是,当删除的路径不存在时,IoTDB会给出相应的错误提示,如下所示:

  1. IoTDB> delete fromroot.ln.wf03.wt02.statuswheretime<now()
  2. Msg: TimeSeries does not exist and its data cannot be deleted
相关文章
|
2月前
|
传感器 物联网 数据处理
认识IoT的基本概念和架构
物联网(Internet of Things, IoT)是现代信息技术的重要组成部分,通过将物理设备连接到互联网,实现设备之间的互联和数据交换。随着传感技术、通信技术和数据处理能力的不断提升,物联网在各个领域展现出巨大的潜力和应用前景。本文将介绍物联网的基本概念、架构、关键技术及其应用场景,并探讨其未来的发展趋势。
81 3
|
30天前
|
物联网 数据管理 Apache
拥抱IoT浪潮,Apache IoTDB如何成为你的智能数据守护者?解锁物联网新纪元的数据管理秘籍!
【8月更文挑战第22天】随着物联网技术的发展,数据量激增对数据库提出新挑战。Apache IoTDB凭借其面向时间序列数据的设计,在IoT领域脱颖而出。相较于传统数据库,IoTDB采用树形数据模型高效管理实时数据,具备轻量级结构与高并发能力,并集成Hadoop/Spark支持复杂分析。在智能城市等场景下,IoTDB能处理如交通流量等数据,为决策提供支持。IoTDB还提供InfluxDB协议适配器简化迁移过程,并支持细致的权限管理确保数据安全。综上所述,IoTDB在IoT数据管理中展现出巨大潜力与竞争力。
45 1
|
1月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
当今社会,物联网技术的发展带来了许多繁琐的挑战,尤其是在数据库管理系统领域,比如实时整合海量数据、处理流中的事件以及处理数据的安全性。例如,应用于智能城市的基于物联网的交通传感器可以实时生成大量的交通数据。据估计,未来5年,物联网设备的数量将达数万亿。物联网产生大量的数据,包括流数据、时间序列数据、RFID数据、传感数据等。要有效地管理这些数据,就需要使用数据库。数据库在充分处理物联网数据方面扮演着非常重要的角色。因此,适当的数据库与适当的平台同等重要。由于物联网在世界上不同的环境中运行,选择合适的数据库变得非常重要。 原创文字,IoTDB 社区可进行使用与传播 一、什么是IoTDB 我
101 9
Apache IoTDB进行IoT相关开发实践
|
29天前
|
Kubernetes 安全 微服务
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
在5G电信领域,Kubernetes集群中部署微服务至关重要,但也带来了重大的安全挑战。Istio作为一个强大的开源服务网格,能有效地管理这些微服务间的通信,通过其控制平面自动将Sidecar代理注入到各微服务Pod中,确保了安全且高效的通信。Istio的架构由数据平面和控制平面组成,其中Sidecar代理作为Envoy代理运行在每个Pod中,拦截并管理网络流量。此外,Istio支持多种Kubernetes发行版和服务,如EKS等,不仅增强了安全性,还提高了应用性能和可观测性。
59 0
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
|
2月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
IoTDB是专为物联网(IoT)设计的开源时间序列数据库,提供数据收集、存储、管理和分析。它支持高效的数据写入、查询,适用于处理大规模物联网数据,包括流数据、时间序列等。IoTDB采用轻量级架构,可与Hadoop和Spark集成,支持多种存储策略,确保数据安全和高可用性。此外,它还具有InfluxDB协议适配器,允许无缝迁移和兼容InfluxDB的API和查询语法,简化物联网项目的数据管理。随着物联网设备数量的快速增长,选择适合的数据库如IoTDB对于数据管理和分析至关重要。
183 12
|
2月前
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
The article introduces IoTDB, an open-source time-series database designed for efficient management of IoT-generated data. It addresses challenges like real-time integration of massive datasets and security. IoTDB supports high-performance storage,
105 0
Apache IoTDB进行IoT相关开发实践
|
23天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
8天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
18 3
|
12天前
|
监控 负载均衡 应用服务中间件
探索微服务架构下的API网关设计与实践
在数字化浪潮中,微服务架构以其灵活性和可扩展性成为企业IT架构的宠儿。本文将深入浅出地介绍微服务架构下API网关的关键作用,探讨其设计原则与实践要点,旨在帮助读者更好地理解和应用API网关,优化微服务间的通信效率和安全性,实现服务的高可用性和伸缩性。
31 3
|
16天前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
39 5

推荐镜像

更多