行協議參考
行協議(Line Protocol)是一種基于文本的格式,用于將數據點寫入TSDB For InfluxDB?。
行協議
語法
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
使用換行符\n
分隔每一行,每一行表示TSDB For InfluxDB?中的一個數據點。行協議是對空格敏感的。
語法描述
行協議告訴TSDB For InfluxDB?數據的measurement、tag set、field set和時間戳。
元素(element) | 可選/必需 | 描述 | 類型(請查看數據類型獲得更多信息) |
---|---|---|---|
Measurement | 必需。 | measurement的名字。TSDB For InfluxDB?中每個數據點接受一個measurement。 | 字符串。 |
Tag set | 可選。 | 一個數據點上全部的tag key-value pairs。 | tag key和tag value都是字符串。 |
Field set | 必需。數據點必須至少有一個field。 | 一個數據點上全部的field key-value pairs。 | field key是字符串,field value可以是浮點數、整數或者布爾值。 |
時間戳 | 可選。如果沒有指定數據點的時間戳,那么TSDB For InfluxDB?使用服務器本地的納秒級時間戳(UTC格式)作為數據點的時間戳。 | 數據點的時間戳。TSDB For InfluxDB?中每個數據點接受一個時間戳。 | Unix納秒級時間戳。使用HTTP API指定除納秒之外其它精度的時間戳。 |
性能和設置提示: 在將數據點發送到數據庫之前,將tag按tag key進行排序。排序結果應該與Go bytes.Compare function的結果匹配。 時間戳盡量使用最粗的精度,因為這可以顯著提高壓縮效果。 使用網絡時間協議(Network Time Protocol,NTP)來同步主機(host)之間的時間。TSDB For InfluxDB?使用主機的本地UTC時間為數據分配時間戳,如果主機的時鐘與NTP不同步,寫入TSDB For InfluxDB?的數據的時間戳可能會不準確。
數據類型
數據類型 | 元素(element) | 描述 |
---|---|---|
浮點數 | Field value | IEEE-754 64位浮點數。這是默認的數值類型。 例如: |
整數 | Field value | 有符號的64位整數(從-9223372036854775808到9223372036854775807)。在數字后面加上 例如: |
字符串 | Measurement,tag key,tag value,field key,Field value | 長度限制為64 KB。 |
布爾值 | Field value | 存儲TRUE或FALSE的值。
|
時間戳 | 時間戳 | Unix納秒級時間戳。使用HTTP API指定除納秒之外其它精度的時間戳。
|
寫入和查詢布爾值的語法
寫入和查詢布爾值的語法不一樣。請查看FAQ獲得更多相關信息。
field type差異
在measurement中,一個field的數據類型在一個shard內不會不一致,但是在不同的shard,它的數據類型可以不同。若想了解field value的數據類型差異如何影響SELECT *
查詢,請參見FAQ的相關章節。
示例
示例一:將field value 1.0作為浮點數寫入TSDB For InfluxDB?
> INSERT mymeas value=1.0
示例二:將field value 1作為浮點數寫入TSDB For InfluxDB?
> INSERT mymeas value=1
示例三:將field value -1.234456e+78作為浮點數寫入TSDB For InfluxDB?
> INSERT mymeas value=-1.234456e+78
TSDB For InfluxDB?支持使用科學計數法指定field value。
示例四:將field value 1作為整數寫入TSDB For InfluxDB?
> INSERT mymeas value=1i
示例五:將field value stringing along作為字符串寫入TSDB For InfluxDB?
> INSERT mymeas value="stringing along"
始終使用雙引號將字符串類型的field value括起來。更多關于引號的介紹,請查看下文引號一節。
示例六:將field value true作為布爾值寫入TSDB For InfluxDB?
> INSERT mymeas value=true
請不要用引號將布爾類型的field value括起來。以下語句把true
作為字符串寫入TSDB For InfluxDB?:
> INSERT mymeas value="true"
示例七:嘗試將字符串寫入之前接受浮點數的field
如果浮點數和字符串上的時間戳存儲在同一個shard:
> INSERT mymeas value=3 1465934559000000000
> INSERT mymeas value="stringing along" 1465934559000000001
ERR: {"error":"field type conflict: input field \"value\" on measurement \"mymeas\" is type string, already exists as type float"}
如果浮點數和字符串上的時間戳不是存儲在同一個shard:
> INSERT mymeas value=3 1465934559000000000
> INSERT mymeas value="stringing along" 1466625759000000000
>
引號、特殊字符和其它命名指南
引號
元素(element) | 雙引號 | 單引號 |
---|---|---|
時間戳 | 不使用 | 不使用 |
measurement, tag key, tag value, field key | 不使用 | 不使用 |
field value | 字符串類型的field value需要用雙引號括起來。不要用雙引號將浮點數、整數或布爾值括起來。 | 不使用 |
行協議允許用戶使用雙引號和單引號將measurement的名字、tag key、tag value和field key括起來。然而,它會把雙引號和單引號當作是名字、key或value的一部分。這會使查詢語法復雜化(請看下面的示例)。
示例
示例一:無效的行協議 - 用雙引號將時間戳括起來
> INSERT mymeas value=9 "1466625759000000000"
ERR: {"error":"unable to parse 'mymeas value=9 \"1466625759000000000\"': bad timestamp"}
用雙引號(或單引號)將時間戳括起來,會產生bad timestamp
錯誤。
示例二:語義錯誤 - 用雙引號將布爾類型的field value括起來
> INSERT mymeas value="true"
> SHOW FIELD KEYS FROM "mymeas"
name: mymeas
------------
fieldKey fieldType
value string
TSDB For InfluxDB?假設所有用雙引號括起來的field value都是字符串。
示例三:語義錯誤 - 用雙引號將measurement的名字括起來
> INSERT "mymeas" value=200
> SHOW MEASUREMENTS
name: measurements
------------------
name
"mymeas"
> SELECT * FROM mymeas
> SELECT * FROM "mymeas"
> SELECT * FROM "\"mymeas\""
name: "mymeas"
--------------
time value
2016-06-14T20:36:21.836131014Z 200
如果您使用雙引號將行協議中的measurement括起來,那么對該measurement的任意查詢都需要在FROM
子句中使用雙引號并且將雙引號轉義(\
)。
特殊字符
對于tag key、tag value和field key,始終使用反斜杠\
來轉義:
逗號
,
等號
=
空格
對于measurement,始終使用反斜杠\
來轉義:
逗號
,
空格
對于字符串類型的field value,使用反斜杠\
來轉義:
雙引號
"
行協議不需要用戶將反斜杠\
轉義。用戶也不需要將其它的特殊字符轉義。
示例
示例一:寫入帶特殊字符的數據點
> INSERT "measurement\ with\ quo??es\ and\ emoji",tag\ key\ with\ sp??ces=tag\,value\,with"commas" field_k\ey="string field value, only \" need be esc??ped"
系統寫入一個數據點,其measurement為"measurement with quo??es and emoji"
,tag key為tag key with sp??ces
,tag value為tag,value,with"commas"
,field key為field_k\ey
,field value為string field value, only " need be esc??ped
。
其它命名指南
在行的開頭,#
是行協議的有效注釋字符。TSDB For InfluxDB?會忽略所有的后續字符,直到遇到下一個換行符\n
。
measurement的名字、tag key、tag value、field key和field value都是大小寫敏感的。
行協議將InfluxQL關鍵字作為標識符名字。通常,我們建議避免在schema中使用InfluxQL關鍵字,因為它可能會在查詢數據時引起混淆。
關鍵字time
是一個特例。time
可以是一個連續查詢名字、數據庫名字、measurement的名字、保留策略名字、subscription的名字和用戶名。在這些情況下,不需要在查詢中用雙引號將time
括起來。time
不能是field key或tag key;TSDB For InfluxDB?拒絕寫入將time
作為field key或tag key的數據,對于這種數據寫入,TSDB For InfluxDB?會返回錯誤。請參見FAQ獲得更多相關信息。
在實踐中的行協議
關于如何將行協議數據寫入數據庫,請查看工具章節。
重復數據點
measurement的名字、tag set和時間戳唯一標識一個數據點。如果您提交的數據具有相同measurement、tag set和時間戳但具有不同field set,那么數據的field set會變為舊field set和新field set的并集,如果有任何沖突以新field set為準。
有關此行為的完整示例和如何避免這種情況,請參見FAQ相關章節。
InfluxDB? is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB?.