小T导读:众所周知,TDengine支持多种写入协议,包括SQL、InfluxDBLine协议、OpenTSDBTelnet协议、OpenTSDBJSON格式协议。但说到如何进行写入操作,很多读者可能都是一头雾水,本篇文章为大家汇总了一系列的写入教程,方便有需要的开发者作为写入指南收藏使用。
TDengine中的SQL写入即模式化写入,在写入到Database之前,需要预先定义好数据表的Schema模式,具体来说就是数据表包含多少列,每列存放的数据类型是什么。即在建表时使用标准的SQL语句指定表的Schema,再遵照预先建好的列跟标签值的数量和类型进行数据写入。
除了SQL写入外,TDengine还支持三种无模式写入协议,分别是InfluxDBLine协议、OpenTSDBTelnet协议和OpenTSDBJSON格式协议。如果你对NoSQL比较熟悉,那对无模式写入应该就不会陌生了。通俗来讲,无模式写入为用户提供了一种以文本格式将数据写入到TDengine的方式,更加便捷。
物联网场景中的应用经常需要采集比较多的数据项,用于实现智能控制、业务分析和设备监控等,由于应用逻辑的版本升级,或者设备自身的硬件调整等原因,数据采集项有可能比较频繁地出现变动,为了在这种情况下仍能方便地完成数据记录工作,TDengine从2.2版本开始就提供了无模式写入方式,写入时无需提前创建超级表和子表,其引擎能自适应数据并对表结构进行调整。
在使用TDengine写入数据时,数据可以单条插入,也可以批量插入,可以插入一个数据采集点的数据,也可以同时插入多个数据采集点的数据。此外,TDengine不仅支持多线程插入、时间乱序数据插入,也支持历史数据插入。下面将对四种写入协议进行说明,以供参考。
SQL写入
用户可以让应用通过连接器执行INSERT语句来插入数据,还可以通过TAOSShell,手动输入INSERT语句来实现。
一次写入一条
下面这条INSERT就将一条记录写入到表d中:
INSERTINTOdVALUES(0,10.3,,0.31);
一次写入多条
TDengine支持一次写入多条记录,比如下面这条命令就将两条记录写入到表d中:
INSERTINTOdVALUES(0,10.2,,0.23)(0,10.3,,0.25);
一次写入多表
TDengine也支持一次向多个表写入数据,比如下面这条命令就向d写入两条记录,向d写入一条记录:
INSERTINTOdVALUES(0,10.3,,0.31)(0,12.6,,0.33)dVALUES(0,12.3,,0.31);
注意事项
如果想要提高写入效率,我们可以使用批量写入,这样一批写入的记录条数越多,插入效率就会越高,但需要注意的是,一条记录不能超过48KB,一条SQL语句总长度不能超过1MB。此外,TDengine支持多线程同时写入,如果要进一步提高写入速度,一个客户端需要打开20个以上的线程同时写。但要注意,线程数达到一定数量后将无法再提高,甚至还会下降,因为线程频繁切换会带来额外开销。
对同一张表来说,如果新插入记录的时间戳已经存在,那默认情形下(UPDATE=0)新记录将被直接抛弃,也就是说,在一张表里时间戳必须是唯一的。如果让应用自动生成记录,很可能生成的时间戳是一样的,这样一来,成功插入的记录条数就会小于应用插入的记录条数。如果在创建Database时使用了UPDATE为1的选项,插入相同时间戳的新记录将覆盖原有记录。
最后一点,写入数据的时间戳必须大于当前时间减去配置参数keep的时间,如果keep配置为天,那么将无法写入比天还早的数据;而且写入数据的时间戳也不能大于当前时间加配置参数days,即如果days为2,那么也将无法写入比当前时间还晚2天的数据。
关于SQL写入的更详细语法规则可参考此前发布的使用TDengine如何进行SQL写入一文。
InfluxDB行协议
InfluxDBLine协议采用一行字符串来表示一行数据。分为四部分:
measurement,tag_setfield_settimestamp
measurement将作为超级表名。它与tag_set之间使用一个英文逗号来分隔。
tag_set将作为标签数据,其格式形如tag_key=tag_value,tag_key=tag_value,也即可以使用英文逗号来分隔多个标签数据。它与field_set之间使用一个半角空格来分隔。
field_set将作为普通列数据,其格式形如field_key=field_value,field_key=field_value,同样是使用英文逗号来分隔多个普通列的数据。它与timestamp之间使用一个半角空格来分隔。
timestamp即本行数据对应的主键时间戳。
例如:
meters,location=California.LosAngeles,groupid=2current=13.4,voltage=,phase=0.
注意事项
tag_set中的所有数据会自动转化为nchar数据类型;
field_set中的每个数据项都需要对自身的数据类型进行描述,比如1.2f32代表float类型的数值1.2,如果不带类型后缀会被当作double处理;
timestamp支持多种时间精度。写入数据时需要用参数指定时间精度,支持从小时到纳秒的6种时间精度。
OpenTSDB行协议
OpenTSDB行协议同样采用一行字符串来表示一行数据。由于OpenTSDB采用的是单列模型,因此一行只能包含一个普通数据列,但标签列依然可以有多个。该协议同样分为四部分,具体格式约定如下:
metrictimestampvaluetagk_1=tagv_1[tagk_n=tagv_n]
需要注意的是:
metric将作为超级表名。
timestamp为本行数据对应的时间戳。根据时间戳的长度自动识别时间精度。支持秒和毫秒两种时间精度
value为度量值,必须为一个数值。对应的列名也是“value”。
最后一部分是标签集,用空格分隔不同标签,所有标签自动转化为nchar数据类型;
例如:
meters.current.3location=California.LosAngelesgroupid=3
具体可以参考OpenTSDBTelnetAPI文档: