<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          No.5時序數(shù)據(jù)庫隨筆 - NaN的支持

          共 6969字,需瀏覽 14分鐘

           ·

          2021-03-18 01:13

          2021 校招請閱讀:阿里云2021春招

          開篇引題

          上一篇我們提到了Apache IoTDB如何支持Nullable的問題,IoTDB用NaN來代表沒有值,查詢之后我們發(fā)現(xiàn)NaN代表來當(dāng)前數(shù)據(jù)類型的默認(rèn)值。如:FLOAT 的默認(rèn)值就是 0.0.

          那么這個結(jié)果是在v.0.11.2 版本的行為,但從NaN的設(shè)計來說,這是一個錯誤的行為,或者說這是一個bug,在IoTDB-1158里面的討論區(qū),我們也提到了這一點,目前在master已經(jīng)修復(fù)了。


          那么今天我們聊一下,有了NaN我們目前還需要對Apache IoTDB增加Nallable的語法支持嗎?


          Nallable的本質(zhì)

          任何功能的支持我們可能需要考慮兩個維度,一是業(yè)務(wù)需求,客觀業(yè)務(wù)場景需要的功能一定是我們需要解決的,二是領(lǐng)域標(biāo)準(zhǔn),做時序數(shù)據(jù)庫我們要考慮傳統(tǒng)數(shù)據(jù)庫標(biāo)準(zhǔn),我們要考慮時序領(lǐng)域的標(biāo)準(zhǔn)。


          在業(yè)務(wù)角度,業(yè)務(wù)期望的是當(dāng)由于某種原因,無法提供當(dāng)前時刻某個傳感器的值的時候,需要在查詢的是被業(yè)務(wù)感知的。那么IoTDB里面提供了NaN的策略來支持如 Float、Double等數(shù)值的不存在的情況,NaN(Not a number)。


          在領(lǐng)域標(biāo)準(zhǔn)方面,傳統(tǒng)數(shù)據(jù)庫是有如 NOT NULL 的語法支持的,也就是說字段類型聲明時候如果沒有聲明NOT NULL默認(rèn)用戶在整行插入時候是可以不攜帶該字段的值的,而顯示聲明了NOT NULL 那么每次insert 語句就必須攜帶當(dāng)前的值。


          今天我們文末就以Apache IoTDB Master代碼再看看對NaN的支持情況,基于Commit: b986cd1e5f 


          同類(InfluxDB)行為

          我們有時候在買東西時候經(jīng)常貨比三家,不管這物品是好是壞,是貴還是便宜,我們看看其他商家是什么品質(zhì),是什么價格,就能輔助我們做判斷。那么學(xué)習(xí)Apache IoTDB的小伙伴,我也建議對InfluxDB有一定的了解. 目前InFluxDB穩(wěn)定版本是1.8.4,我們就以1.8.4為例體驗一下InfluxDB對null的支持方式。


          二進制安裝

          ?


          我們今天在macOS下進行操作,首先確保你已經(jīng)安裝了brew工具。然后我們可以一條命令安裝InfluxDB v1.8.4.

          brew updatebrew install influxdb


          啟動InfluxDB服務(wù)

          influxd



          客戶端連接并創(chuàng)建測試數(shù)據(jù)庫

          jincheng:~ jincheng.sunjc$ influx -precision rfc3339Connected to http://localhost:8086 version 1.8.4InfluxDB shell version: 1.8.4
          CREATE DATABASE "lemming";use lemming;INSERT cpu,host=LemmingServer,region=zh_hz value=1.68SELECT * FROM cpu;


          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"}

          如上現(xiàn)象說明InfluxDB本身對單值的插入也是不支持Null的。那么這個和IoTDB的現(xiàn)狀是一樣的。我們再來看看多值同時插入的時候“現(xiàn)象”。


          • 插入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

          所以根據(jù)目前表現(xiàn),InfulxDB v1.8.4 不支持直接插入Null,但是可以在多值插入時候,不攜帶某個值,也就是空值的支持。


          IoTDB Master 行為(b986cd1e5f)

          我們基于 b986cd1e5f進行編譯,如下:


          啟動服務(wù)和CLI

          啟動服務(wù),如下:

          jincheng:apache-iotdb-0.12.0-SNAPSHOT-all-bin jincheng.sunjc$ nohup sbin/start-server.sh >/dev/null 2>&1 &[1] 22357

          注意我們最新的發(fā)布目錄已經(jīng)有變化`apache-iotdb-0.12.0-SNAPSHOT-all-bin`。

          連接服務(wù)進入CLI,如下:

          sbin/start-cli.sh -h 127.0.0.1 -p 6667 -u root -pw root


          NaN的支持

          先進行一些初始化,如下:

          SET STORAGE GROUP TO root.lnCREATE TIMESERIES root.ln.wf01.wt01.status WITH DATATYPE=BOOLEAN, ENCODING=PLAINCREATE TIMESERIES root.ln.wf01.wt01.temperature WITH DATATYPE=FLOAT, ENCODING=RLE

          • 單值的插入

            正常插入

          INSERT INTO root.ln.wf01.wt01(timestamp,statusvalues(100,true);INSERT INTO root.ln.wf01.wt01(timestamp,temperature) values(200,20.71)

          我們可以看到,單值正常插入都是OK的,同時我們在查詢時候,如果在相同ts某些值不存在時候,我們查詢出來顯示是null的,用戶可以感知到多時間序列按時間對齊形成一行數(shù)據(jù)時候哪些字段為null。

                  異常插

          IoTDB> INSERT INTO root.ln.wf01.wt01(timestamp,temperature) values(200,)Msg: 401: Error occurred while parsing SQL to physical plan: line 1:64 mismatched input ')' expecting {NOW, TRUE, FALSE, '-', '.', 'NaN', INT, EXPONENT, DATETIME, DOUBLE_QUOTE_STRING_LITERAL, SINGLE_QUOTE_STRING_LITERAL}IoTDB> INSERT INTO root.ln.wf01.wt01(timestamp,temperature) values(200,'')Msg: 313: failed to insert measurements [temperature] caused by For input string: "''"IoTDB> INSERT INTO root.ln.wf01.wt01(timestamp,temperature) values(200,null)Msg: 401: Error occurred while parsing SQL to physical plan: line 1:64 mismatched input 'null' expecting {NOW, TRUE, FALSE, '-', '.', 'NaN', INT, EXPONENT, DATETIME, DOUBLE_QUOTE_STRING_LITERAL, SINGLE_QUOTE_STRING_LITERAL}IoTDB> 

          這個現(xiàn)象其實與InfluxDB的表象也是一樣的,我們這樣設(shè)計也是合理的,因為我們是強類型系統(tǒng),聲明了FLOAT類型,就必須插入的是FLOAT值。那么我們再看看多值插入的行為表現(xiàn)。

          • 多值的插入

            正常插入

          INSERT INTO root.ln.wf01.wt01(timestamp,status,temperature) values(200,false,20.71)

          上面一切正常,注意一點,我們插入時間戳是用的是200,那么會覆蓋之前的相同時間戳的值。

                  缺值插入

           INSERT INTO root.ln.wf01.wt01(timestamp,status,temperature) values(200,false,) INSERT INTO root.ln.wf01.wt01(timestamp,status,temperature) values(200,false,null) INSERT INTO root.ln.wf01.wt01(timestamp,status,temperature) values(200,false,NaN)

          其實,大家發(fā)現(xiàn)多值插入,和單值插入的支持是一樣的,如果顯示的指定要要插入某個列的值,那么就必須在values里面有其合法的值進行插入。如果沒有業(yè)務(wù)值,IoTDB為大家提供了NaN來表示沒有具體的數(shù)值。當(dāng)然,NaN不僅僅在多值插入時候可以應(yīng)用,在單值進行插入時候也是一樣可以支持的。比如:



          篇尾提問:為啥一定需要NaN呢?

          看到這里大家也許會有個疑問,既然我在插入時候沒有值我就可以不插入,在查詢的時候 IoTDB可以按時間對齊形成一行數(shù)據(jù)顯示,對應(yīng)時間戳不存在的值用null來顯示來,那么我們?yōu)槭裁催€要用NaN呢?


          這個就和業(yè)務(wù)有點關(guān)系來,比如:如果一個列的值是null顯示的,那么到底是當(dāng)時這個時間點真的設(shè)備沒有值上送,還是雖然設(shè)備上送了數(shù)值,但是由于業(yè)務(wù)程序bug(或者值不合法)導(dǎo)致沒有插入成功呢?這個問題是很難回答了,因為:


          1. 設(shè)備沒上送值我們不插入,查詢時候是null,

          2. 設(shè)備雖然上送了,但是業(yè)務(wù)代碼有bug沒有插入成功,查詢時候也是null,

          但是如果我們有NaN的支持,那么我們在業(yè)務(wù)代碼里面每一個時間戳都對應(yīng)的所有列我們都進行值的插入,如果沒有值或者值不合法,那么我們就顯示的設(shè)置一個NaN代表業(yè)務(wù)本身在那個時刻沒有收到合法的值,而一旦出現(xiàn)null,那就代表在那個時刻業(yè)務(wù)沒有收到設(shè)備的任何數(shù)據(jù)事件,也沒有進行任何insert動作,所以查詢時候就是null,就可以方便的定位問題了。


          再回到開篇的問題,有了NaN我們目前還需要對Apache IoTDB增加Nallable的語法支持嗎?


          NaN 不等于 Nullable

          NaN解決了Float/Double的某些場景的業(yè)務(wù)問題,但是其他非數(shù)值類型,如今天涉及到的Boolean類型是沒有支持,從語義角度非數(shù)值類型也不應(yīng)該有NaN的設(shè)計,所以關(guān)于非數(shù)值類型的Null的考慮還是值得進一步討論的。


          下一篇聊什么?


          我們希望每一篇都聊點用戶提到的問題,下一篇我們聊了InfluxDB和IoTDB如何解決下面這個朋友的問題:

          如果你有答案,也可以提前留言,看看你和我的思考是否一樣... :) 我們今天就到這里,下次見。


          阿里招聘

          時序數(shù)據(jù)庫開發(fā)崗位

          (P7/P8/P9)

          (長期有效)


          職位描述:

          1. 精通Java/Scala編程

          2. 精通常用數(shù)據(jù)結(jié)構(gòu)和算法應(yīng)用,具備良好的、精益求精的設(shè)計思維,每一個bit都是客戶/技術(shù)價值。

          3. 了解Hadoop/Flink/Spark等計算框架和熟悉HBase/LevelDB/RocksDB等主流NoSQL數(shù)據(jù)庫,深入理解其實現(xiàn)原理和架構(gòu)優(yōu)勢劣勢;

          4. 具備分布式系統(tǒng)的設(shè)計和應(yīng)用的經(jīng)歷,能對分布式常用技術(shù)進行應(yīng)用和改進者優(yōu)先;

          5. 有開源社區(qū)貢獻,并成為Flink/Spark/Druid/OpenTSDB/InfluxDB/IoTDB等社區(qū)的Committer/PMC者優(yōu)先;

          6. 要具備良好的團隊協(xié)作能力,良好的溝通表達能力,和對正確事情持之以恒的韌性和耐力。


          來!讓我看到你的簡歷,因為成就你的不僅僅是能力,更是雷厲風(fēng)行的執(zhí)行力!


          瀏覽 139
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  毛片毛片毛片毛片毛片 | 在线操屄观看 | 国产乱伦一区 | 蜜桃视频在线播放 | 国产像蕉9 |