六月婷婷AV,国产偷窥猎奇福利二区,日韩三级片。,好吊色网站,日韩成人中文在线视频,国产亚洲午夜啪啪,亚洲欧美另类国产精品,国产成人av1,任你艹在线观看

Schemaless 寫入主要處理邏輯匯總,這些知識(shí)點(diǎn)要記牢!

小 T 導(dǎo)讀:為了在數(shù)據(jù)采集項(xiàng)頻繁變動(dòng)的情況下保證用戶仍然能夠順利地完成數(shù)據(jù)記錄工作,TDengine 提供了三種無(wú)模式寫入?yún)f(xié)議,分別是 InfluxDB Line 協(xié)議、OpenTSDB Telnet 協(xié)議和 OpenTSDB JSON 格式協(xié)議。本文將對(duì)無(wú)模式寫入方式的主要處理邏輯、映射規(guī)則與變更處理等進(jìn)行分析,便于用戶理解與使用。

通常來(lái)說(shuō),物聯(lián)網(wǎng)應(yīng)用常會(huì)采集比較多的數(shù)據(jù)項(xiàng),用于實(shí)現(xiàn)智能控制、業(yè)務(wù)分析、設(shè)備監(jiān)控等功能。但在此過(guò)程中,由于應(yīng)用邏輯的版本升級(jí),或者設(shè)備自身的硬件調(diào)整等原因,數(shù)據(jù)采集項(xiàng)可能較為頻繁地出現(xiàn)變動(dòng)。這也是時(shí)序數(shù)據(jù)庫(kù)(Time Series Database,TSDB)需要應(yīng)對(duì)的一個(gè)挑戰(zhàn)。

為了在這種情況下順利完成數(shù)據(jù)記錄工作,TDengine 時(shí)序數(shù)據(jù)庫(kù) 提供了 Schemaless 寫入方式,讓用戶可以省略掉預(yù)先創(chuàng)建超級(jí)表/子表的步驟,憑借數(shù)據(jù)寫入接口能夠自動(dòng)創(chuàng)建與數(shù)據(jù)對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)。在必要時(shí),Schemaless 將自動(dòng)增加必要的數(shù)據(jù)列,保證用戶寫入的數(shù)據(jù)能夠被正確存儲(chǔ)。

值得一提的是,通過(guò)無(wú)模式寫入方式建立的超級(jí)表及其對(duì)應(yīng)的子表,與通過(guò) SQL 直接建立的超級(jí)表和子表完全沒有區(qū)別,你也可以通過(guò) SQL 語(yǔ)句直接向其中寫入數(shù)據(jù)。但需要注意,通過(guò)無(wú)模式寫入方式建立的表,其表名是基于標(biāo)簽值按照固定的映射規(guī)則生成的,所以無(wú)法明確地進(jìn)行表意,缺乏可讀性。

無(wú)模式寫入行協(xié)議

TDengine 的無(wú)模式寫入行協(xié)議兼容 InfluxDB 的行協(xié)議(Line Protocol)、OpenTSDB 的 telnet 行協(xié)議、OpenTSDB 的 JSON 格式協(xié)議。但是使用這三種協(xié)議的時(shí)候,需要在 API 中指定輸入內(nèi)容使用解析協(xié)議的標(biāo)準(zhǔn)。

對(duì)于 InfluxDB、OpenTSDB 的標(biāo)準(zhǔn)寫入?yún)f(xié)議請(qǐng)參考《在 TDengine 中如何高效寫入?四種寫入方式提效大全》。下面首先以 InfluxDB 的行協(xié)議為基礎(chǔ),介紹 TDengine 擴(kuò)展的協(xié)議內(nèi)容,允許用戶采用更加精細(xì)的方式控制(超級(jí)表)模式。

Schemaless 采用一個(gè)字符串來(lái)表達(dá)一個(gè)數(shù)據(jù)行(可以向?qū)懭?API 中一次傳入多行字符串來(lái)實(shí)現(xiàn)多個(gè)數(shù)據(jù)行的批量寫入),其格式約定如下:

measurement,tag_set field_set timestamp

其中:

  • measurement 將作為數(shù)據(jù)表名。它與 tag_set 之間使用一個(gè)英文逗號(hào)來(lái)分隔。
  • tag_set 將作為標(biāo)簽數(shù)據(jù),其格式形如 <tag_key>=<tag_value>,<tag_key>=<tag_value>,也即可以使用英文逗號(hào)來(lái)分隔多個(gè)標(biāo)簽數(shù)據(jù)。它與 field_set 之間使用一個(gè)半角空格來(lái)分隔。
  • field_set 將作為普通列數(shù)據(jù),其格式形如 <field_key>=<field_value>,<field_key>=<field_value>,同樣是使用英文逗號(hào)來(lái)分隔多個(gè)普通列的數(shù)據(jù)。它與 timestamp 之間使用一個(gè)半角空格來(lái)分隔。
  • timestamp 即本行數(shù)據(jù)對(duì)應(yīng)的主鍵時(shí)間戳。

tag_set 中所有的數(shù)據(jù)自動(dòng)轉(zhuǎn)化為 nchar 數(shù)據(jù)類型,并不需要使用雙引號(hào)(”)。在無(wú)模式寫入數(shù)據(jù)行協(xié)議中,field_set 中的每個(gè)數(shù)據(jù)項(xiàng)都需要對(duì)自身的數(shù)據(jù)類型進(jìn)行描述。具體來(lái)說(shuō):

  • 如果兩邊有英文雙引號(hào),表示 BINARY(32) 類型。例如 "abc"。
  • 如果兩邊有英文雙引號(hào)而且?guī)в?L 前綴,表示 NCHAR(32) 類型。例如 L"報(bào)錯(cuò)信息"
  • 對(duì)空格、等號(hào)(=)、逗號(hào)(,)、雙引號(hào)(”),前面需要使用反斜杠(\)進(jìn)行轉(zhuǎn)義(都指的是英文半角符號(hào))。
  • 數(shù)值類型將通過(guò)后綴來(lái)區(qū)分?jǐn)?shù)據(jù)類型,如后綴為無(wú)或 f64,映射的數(shù)據(jù)類型為 double;后綴為 f32,映射為 float,可移步 https://docs.taosdata.com/reference/schemaless/ 了解更多的后綴及映射類型。
  • t, T, true, True, TRUE, f, F, false, False 將直接作為 BOOL 型來(lái)處理。

例如如下數(shù)據(jù)行表示:向名為 st 的超級(jí)表下的 t1 標(biāo)簽為 “3”(NCHAR)、t2 標(biāo)簽為 “4”(NCHAR)、t3 標(biāo)簽為 “t3″(NCHAR)的數(shù)據(jù)子表,寫入 c1 列為 3(BIGINT)、c2 列為 false(BOOL)、c3 列為 “passit”(BINARY)、c4 列為 4(DOUBLE)、主鍵時(shí)間戳為 1626006833639000000 的一行數(shù)據(jù)。

st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000

需要注意的是,如果描述數(shù)據(jù)類型后綴時(shí)使用了錯(cuò)誤的大小寫,或者為數(shù)據(jù)指定的數(shù)據(jù)類型有誤,均可能引發(fā)報(bào)錯(cuò)提示而導(dǎo)致數(shù)據(jù)寫入失敗。

無(wú)模式寫入的主要處理邏輯

無(wú)模式寫入使用如下規(guī)則來(lái)生成子表名:首先將 measurement 的名稱和標(biāo)簽的 key 和 value 組合成為如下的字符串——

"measurement,tag_key1=tag_value1,tag_key2=tag_value2"

需要注意的是,這里的 tagkey1,tag_key2 并不是用戶輸入的標(biāo)簽的原始順序,而是使用了標(biāo)簽名稱按照字符串升序排列后的結(jié)果,所以,tag_key1 并不是在行協(xié)議中輸入的第一個(gè)標(biāo)簽。 排列完成以后計(jì)算該字符串的 MD5 散列值為 “md5_val”,我們將計(jì)算的結(jié)果與字符串組合生成表名:“t_md5_val”,其中的 “t” 是固定的前綴,每個(gè)通過(guò)該映射關(guān)系自動(dòng)生成的表都具有該前綴。

用戶可以通過(guò)在 taos.cfg 里配置 smlChildTableName 參數(shù)來(lái)指定生成的表名。 舉例如下:配置 smlChildTableName=tname 插入數(shù)據(jù)為 st,tname=cpu1,t1=4 c1=3 1626006833639000000,則創(chuàng)建的表名為 cpu1,注意如果多行數(shù)據(jù) tname 相同,但是后面的 tag_set 不同,則使用第一行自動(dòng)建表時(shí)指定的 tag_set,其他的行會(huì)忽略。

此外,在處理行數(shù)據(jù)時(shí),其他原則如下所示:

  1. 如果解析行協(xié)議獲得的超級(jí)表不存在,則會(huì)自動(dòng)創(chuàng)建這個(gè)超級(jí)表(不建議手動(dòng)創(chuàng)建超級(jí)表,不然插入數(shù)據(jù)可能異常)。
  2. 如果解析行協(xié)議獲得子表不存在,則 Schemaless 會(huì)按照步驟 1 或 2 確定的子表名來(lái)創(chuàng)建子表。
  3. 如果數(shù)據(jù)行中指定的標(biāo)簽列或普通列不存在,則在超級(jí)表中增加對(duì)應(yīng)的標(biāo)簽列或普通列(只增不減)。
  4. 如果超級(jí)表中存在一些標(biāo)簽列或普通列未在一個(gè)數(shù)據(jù)行中被指定取值,那么這些列的值在這一行中會(huì)被置為 NULL。
  5. 對(duì) BINARY 或 NCHAR 列,如果數(shù)據(jù)行中所提供值的長(zhǎng)度超出了列類型的限制,自動(dòng)增加該列允許存儲(chǔ)的字符長(zhǎng)度上限(只增不減),以保證數(shù)據(jù)的完整保存。
  6. 整個(gè)處理過(guò)程中遇到的錯(cuò)誤會(huì)中斷寫入過(guò)程,并返回錯(cuò)誤代碼。
  7. 為了提高寫入的效率,默認(rèn)假設(shè)同一個(gè)超級(jí)表中 field_set 的順序是一樣的(第一條數(shù)據(jù)包含所有的 field,后面的數(shù)據(jù)按照這個(gè)順序),如果順序不一樣,需要配置參數(shù) smlDataFormat 為 false,否則,數(shù)據(jù)寫入按照相同順序?qū)懭?,?kù)中數(shù)據(jù)會(huì)異常。

注意,無(wú)模式所有的處理邏輯仍會(huì)遵循 TDengine 對(duì)數(shù)據(jù)結(jié)構(gòu)的底層限制,例如每行數(shù)據(jù)的總長(zhǎng)度不能超過(guò) 16KB。這方面的具體限制約束請(qǐng)參見 TDengine SQL 邊界限制(https://docs.taosdata.com/taos-sql/limit/)。

數(shù)據(jù)模式映射規(guī)則與變更處理

以 InfluxDB 行協(xié)議為例,其數(shù)據(jù)如何映射成為具有模式的數(shù)據(jù)?從上文中我們了解到,每個(gè)行協(xié)議中數(shù)據(jù) measurement 映射為超級(jí)表名稱,tag_set 中的標(biāo)簽名稱為數(shù)據(jù)模式中的標(biāo)簽名,field_set 中的名稱為列名稱。以如下數(shù)據(jù)為例,說(shuō)明映射規(guī)則:

st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000

該行數(shù)據(jù)映射生成一個(gè)超級(jí)表:st, 其包含了 3 個(gè)類型為 nchar 的標(biāo)簽,分別是:t1, t2, t3;五個(gè)數(shù)據(jù)列,分別是 ts(timestamp),c1 (bigint),c3(binary),c2 (bool), c4 (bigint)。映射成為如下 SQL 語(yǔ)句:

create stable st (_ts timestamp, c1 bigint, c2 bool, c3 binary(6), c4 bigint) tags(t1 nchar(1), t2 nchar(1), t3 nchar(2))

在數(shù)據(jù)模式變更處理中,不同行數(shù)據(jù)寫入情況下,對(duì)于數(shù)據(jù)模式的影響也不同。在使用行協(xié)議寫入一個(gè)明確標(biāo)識(shí)的字段類型時(shí),后續(xù)再更改該字段的類型定義,會(huì)出現(xiàn)明確的數(shù)據(jù)模式錯(cuò)誤,即會(huì)觸發(fā)寫入 API 報(bào)告錯(cuò)誤。如下所示:

st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4    1626006833639000000
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4i   1626006833640000000

第一行的數(shù)據(jù)類型映射將 c4 列定義為 Double, 但是第二行的數(shù)據(jù)又通過(guò)數(shù)值后綴方式聲明該列為 BigInt, 由此會(huì)觸發(fā)無(wú)模式寫入的解析錯(cuò)誤。如果列前面的行協(xié)議將數(shù)據(jù)列聲明為了 binary, 后續(xù)的要求長(zhǎng)度更長(zhǎng)的 binary 長(zhǎng)度,此時(shí)會(huì)觸發(fā)超級(jí)表模式的變更。

st,t1=3,t2=4,t3=t3 c1=3i64,c5="pass"     1626006833639000000
st,t1=3,t2=4,t3=t3 c1=3i64,c5="passit"   1626006833640000000

第一行中行協(xié)議解析會(huì)聲明 c5 列是一個(gè) binary(4)的字段,第二次行數(shù)據(jù)寫入會(huì)提取列 c5 仍然是 binary 列,但是其寬度為 6,此時(shí)需要將 binary 的寬度增加到能夠容納新字符串的寬度。

st,t1=3,t2=4,t3=t3 c1=3i64               1626006833639000000
st,t1=3,t2=4,t3=t3 c1=3i64,c6="passit"   1626006833640000000

第二行數(shù)據(jù)相對(duì)于第一行來(lái)說(shuō)增加了一個(gè)列 c6,類型為 binary(6)。那么此時(shí)會(huì)自動(dòng)增加一個(gè)列 c6, 類型為 binary(6)。

寫在最后

受篇幅所限,關(guān)于無(wú)模式寫入的時(shí)間分辨率識(shí)別、寫入完整性、錯(cuò)誤碼等內(nèi)容請(qǐng)參考 https://docs.taosdata.com/reference/schemaless/ 。如有更多問題,歡迎加入 TDengine 用戶交流群,屆時(shí)將會(huì)有專業(yè)的技術(shù)人員為你解惑。

TDengine Database