No.5时序数据库随笔 - NaN的支持
发布时间:2022-08-02 12:15:22 所属栏目:云计算 来源:互联网
导读:开篇引题 上一篇我们提到了Apache IoTDB如何支持Nullable的问题,IoTDB用NaN来代表没有值,查询之后我们发现NaN代表来当前数据类型的默认值。如:FLOAT 的默认值就是 0.0. 图片 那么这个结果是在v.0.11.2 版本的行为,但从NaN的设计来说,这是一个错误的行为
|
开篇引题 上一篇我们提到了Apache IoTDB如何支持Nullable的问题,IoTDB用NaN来代表没有值,查询之后我们发现NaN代表来当前数据类型的默认值。如:FLOAT 的默认值就是 0.0. 图片 那么这个结果是在v.0.11.2 版本的行为,但从NaN的设计来说,这是一个错误的行为,或者说这是一个bug,在IoTDB-1158里面的讨论区,我们也提到了这一点,目前在master已经修复了。 那么今天我们聊一下,有了NaN我们目前还需要对Apache IoTDB增加Nallable的语法支持吗? Nallable的本质 任何功能的支持我们可能需要考虑两个维度,一是业务需求,客观业务场景需要的功能一定是我们需要解决的,二是领域标准,做时序数据库我们要考虑传统数据库标准,我们要考虑时序领域的标准。 在业务角度,业务期望的是当由于某种原因,无法提供当前时刻某个传感器的值的时候,需要在查询的是被业务感知的。那么IoTDB里面提供了NaN的策略来支持如 Float、Double等数值的不存在的情况,NaN(Not a number)。 在领域标准方面,传统数据库是有如 NOT NULL 的语法支持的,也就是说字段类型声明时候如果没有声明NOT NULL默认用户在整行插入时候是可以不携带该字段的值的,而显示声明了NOT NULL 那么每次insert 语句就必须携带当前的值。 今天我们文末就以Apache IoTDB Master代码再看看对NaN的支持情况,基于Commit: b986cd1e5f 同类(InfluxDB)行为 我们有时候在买东西时候经常货比三家,不管这物品是好是坏,是贵还是便宜,我们看看其他商家是什么品质,是什么价格,就能辅助我们做判断。那么学习Apache IoTDB的小伙伴,我也建议对InfluxDB有一定的了解. 目前InFluxDB稳定版本是1.8.4,我们就以1.8.4为例体验一下InfluxDB对null的支持方式。 二进制安装 我们今天在macOS下进行操作,首先确保你已经安装了brew工具。然后我们可以一条命令安装InfluxDB v1.8.4. 复制 brew update brew install influxdb 1. 2. 图片 启动InfluxDB服务 复制 influxd 1. 图片 客户端连接并创建测试数据库 复制 jincheng:~ jincheng.sunjc$ influx -precision rfc3339 Connected to http://localhost:8086 version 1.8.4 InfluxDB shell version: 1.8.4 CREATE DATABASE "lemming"; use lemming; INSERT cpu,host=LemmingServer,region=zh_hz value=1.68 SELECT * FROM cpu; 1. 2. 3. 4. 5. 6. 7. 图片 Nullable的支持情况 单值插入Null(参考InfluxDB的历史信息) https://github.com/influxdata/influxdb/issues/7722 https://github.com/influxdata/influxdb/pull/2429 https://github.com/influxdata/influxdb/blob/v1.8.4/CHANGELOG.md > INSERT cpu,host=LemmingServer,region=zh_hz value= ERR: {"error":"unable to parse 'cpu,host=LemmingServer,region=zh_hz value=': missing field value"} INSERT cpu,host=LemmingServer,region=zh_hz value='' ERR: {"error":"unable to parse 'cpu,host=LemmingServer,region=zh_hz value=''': invalid boolean"} > INSERT cpu,host=LemmingServer,region=zh_hz value=null ERR: {"error":"unable to parse 'cpu,host=LemmingServer,region=zh_hz value=null': invalid number"} 如上现象说明InfluxDB本身对单值的插入也是不支持Null的。那么这个和IoTDB的现状是一样的。我们再来看看多值同时插入的时候“现象”。 多插入Null 正常插入: > INSERT temperature,machine=unit42,type=assembly external=25,internal=37 > select * from temperature; name: temperature time external internal machine type ---- -------- -------- ------- ---- 2021-02-24T04:03:35.634296Z 25 37 unit42 assembly internal为空: > INSERT temperature,machine=unit42,type=assembly external=25,internal= ERR: {"error":"unable to parse 'temperature,machine=unit42,type=assembly external=25,internal=': missing field value"} internal为null: > INSERT temperature,machine=unit42,type=assembly external=25,internal=null ERR: {"error":"unable to parse 'temperature,machine=unit42,type=assembly external=25,internal=null': invalid number"} 不携带internal: > INSERT temperature,machine=unit42,type=assembly external=25 > select * from temperature; name: temperature time external internal machine type ---- -------- -------- ------- ---- 2021-02-24T04:03:35.634296Z 25 37 unit42 assembly 2021-02-24T04:05:37.18028Z 25 unit42 assembly 图片 (编辑:珠海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

