加入收藏 | 设为首页 | 会员中心 | 我要投稿 珠海站长网 (https://www.0756zz.cn/)- 云服务器、边缘计算、基础存储、云计算、中间件!
当前位置: 首页 > 云计算 > 正文

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
 
  图片

(编辑:珠海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读