OpenTSDB 行协议

    • metric 将作为超级表名;
    • timestamp 本行数据对应的时间戳。根据时间戳的长度自动识别时间精度。支持秒和毫秒两种时间精度;
    • value 度量值,必须为一个数值。对应的列名是 “_value”;
    • 最后一部分是标签集, 用空格分隔不同标签, 所有标签自动转化为 NCHAR 数据类型。

    例如:

    • 默认生产的子表名是根据规则生成的唯一 ID 值。用户也可以通过在 taos.cfg 里配置 smlChildTableName 参数来指定某个标签值作为子表名。该标签值应该具有全局唯一性。举例如下:假设有个标签名为tname, 配置 smlChildTableName=tname, 插入数据为 meters.current 1648432611250 11.3 tname=cpu1 location=California.LosAngeles groupid=3 则创建的表名为 cpu1,注意如果多行数据 tname 相同,但是后面的 tag_set 不同,则使用第一行自动建表时指定的 tag_set,其他的行会忽略)。 参考 。
    • Java
    • Python
    • Go
    • Node.js
    • C#
    • C
    1. package com.taos.example;
    2. import com.taosdata.jdbc.SchemalessWriter;
    3. import com.taosdata.jdbc.enums.SchemalessProtocolType;
    4. import com.taosdata.jdbc.enums.SchemalessTimestampType;
    5. import java.sql.Connection;
    6. import java.sql.DriverManager;
    7. import java.sql.SQLException;
    8. import java.sql.Statement;
    9. public class TelnetLineProtocolExample {
    10. // format: <metric> <timestamp> <value> <tagk_1>=<tagv_1>[ <tagk_n>=<tagv_n>]
    11. private static String[] lines = { "meters.current 1648432611249 10.3 location=California.SanFrancisco groupid=2",
    12. "meters.current 1648432611250 12.6 location=California.SanFrancisco groupid=2",
    13. "meters.current 1648432611249 10.8 location=California.LosAngeles groupid=3",
    14. "meters.current 1648432611250 11.3 location=California.LosAngeles groupid=3",
    15. "meters.voltage 1648432611249 219 location=California.SanFrancisco groupid=2",
    16. "meters.voltage 1648432611250 218 location=California.SanFrancisco groupid=2",
    17. "meters.voltage 1648432611249 221 location=California.LosAngeles groupid=3",
    18. "meters.voltage 1648432611250 217 location=California.LosAngeles groupid=3",
    19. };
    20. private static Connection getConnection() throws SQLException {
    21. String jdbcUrl = "jdbc:TAOS://localhost:6030?user=root&password=taosdata";
    22. return DriverManager.getConnection(jdbcUrl);
    23. }
    24. private static void createDatabase(Connection conn) throws SQLException {
    25. try (Statement stmt = conn.createStatement()) {
    26. // the default precision is ms (microsecond), but we use us(microsecond) here.
    27. stmt.execute("CREATE DATABASE IF NOT EXISTS test precision 'us'");
    28. stmt.execute("USE test");
    29. }
    30. }
    31. public static void main(String[] args) throws SQLException {
    32. try (Connection conn = getConnection()) {
    33. createDatabase(conn);
    34. SchemalessWriter writer = new SchemalessWriter(conn);
    35. writer.write(lines, SchemalessProtocolType.TELNET, SchemalessTimestampType.NOT_CONFIGURED);
    36. }
    37. }
    38. }

    1. package main
    2. import (
    3. "github.com/taosdata/driver-go/v3/af"
    4. )
    5. func prepareDatabase(conn *af.Connector) {
    6. _, err := conn.Exec("CREATE DATABASE test")
    7. if err != nil {
    8. panic(err)
    9. }
    10. if err != nil {
    11. panic(err)
    12. }
    13. }
    14. func main() {
    15. conn, err := af.Open("localhost", "root", "taosdata", "", 6030)
    16. if err != nil {
    17. log.Fatalln("fail to connect, err:", err)
    18. }
    19. defer conn.Close()
    20. prepareDatabase(conn)
    21. var lines = []string{
    22. "meters.current 1648432611249 10.3 location=California.SanFrancisco groupid=2",
    23. "meters.current 1648432611250 12.6 location=California.SanFrancisco groupid=2",
    24. "meters.current 1648432611249 10.8 location=California.LosAngeles groupid=3",
    25. "meters.current 1648432611250 11.3 location=California.LosAngeles groupid=3",
    26. "meters.voltage 1648432611249 219 location=California.SanFrancisco groupid=2",
    27. "meters.voltage 1648432611250 218 location=California.SanFrancisco groupid=2",
    28. "meters.voltage 1648432611249 221 location=California.LosAngeles groupid=3",
    29. "meters.voltage 1648432611250 217 location=California.LosAngeles groupid=3",
    30. }
    31. err = conn.OpenTSDBInsertTelnetLines(lines)
    32. if err != nil {
    33. log.Fatalln("insert error:", err)
    34. }
    35. }

    查看源码

    1. const taos = require("@tdengine/client");
    2. const conn = taos.connect({
    3. host: "localhost",
    4. });
    5. const cursor = conn.cursor();
    6. function createDatabase() {
    7. cursor.execute("CREATE DATABASE test");
    8. cursor.execute("USE test");
    9. }
    10. function insertData() {
    11. const lines = [
    12. "meters.current 1648432611249 10.3 location=California.SanFrancisco groupid=2",
    13. "meters.current 1648432611250 12.6 location=California.SanFrancisco groupid=2",
    14. "meters.current 1648432611249 10.8 location=California.LosAngeles groupid=3",
    15. "meters.current 1648432611250 11.3 location=California.LosAngeles groupid=3",
    16. "meters.voltage 1648432611249 219 location=California.SanFrancisco groupid=2",
    17. "meters.voltage 1648432611250 218 location=California.SanFrancisco groupid=2",
    18. "meters.voltage 1648432611249 221 location=California.LosAngeles groupid=3",
    19. "meters.voltage 1648432611250 217 location=California.LosAngeles groupid=3",
    20. ];
    21. cursor.schemalessInsert(
    22. taos.SCHEMALESS_PROTOCOL.TSDB_SML_TELNET_PROTOCOL,
    23. taos.SCHEMALESS_PRECISION.TSDB_SML_TIMESTAMP_NOT_CONFIGURED
    24. );
    25. }
    26. try {
    27. createDatabase();
    28. insertData();
    29. } finally {
    30. cursor.close();
    31. conn.close();
    32. }

    1. int main() {
    2. TAOS *taos = taos_connect("localhost", "root", "taosdata", "", 6030);
    3. if (taos == NULL) {
    4. printf("failed to connect to server\n");
    5. exit(EXIT_FAILURE);
    6. }
    7. executeSQL(taos, "DROP DATABASE IF EXISTS test");
    8. executeSQL(taos, "CREATE DATABASE test");
    9. executeSQL(taos, "USE test");
    10. char *lines[] = {
    11. "meters.current 1648432611249 10.3 location=California.SanFrancisco groupid=2",
    12. "meters.current 1648432611250 12.6 location=California.SanFrancisco groupid=2",
    13. "meters.current 1648432611249 10.8 location=California.LosAngeles groupid=3",
    14. "meters.current 1648432611250 11.3 location=California.LosAngeles groupid=3",
    15. "meters.voltage 1648432611249 219 location=California.SanFrancisco groupid=2",
    16. "meters.voltage 1648432611250 218 location=California.SanFrancisco groupid=2",
    17. "meters.voltage 1648432611249 221 location=California.LosAngeles groupid=3",
    18. "meters.voltage 1648432611250 217 location=California.LosAngeles groupid=3",
    19. };
    20. TAOS_RES *res = taos_schemaless_insert(taos, lines, 8, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
    21. if (taos_errno(res) != 0) {
    22. printf("failed to insert schema-less data, reason: %s\n", taos_errstr(res));
    23. } else {
    24. int affectedRow = taos_affected_rows(res);
    25. printf("successfully inserted %d rows\n", affectedRow);
    26. }
    27. taos_free_result(res);
    28. taos_close(taos);
    29. taos_cleanup();
    30. }
    31. // output:
    32. // successfully inserted 8 rows

    查看源码

    以上示例代码会自动创建 2 个超级表, 每个超级表有 4 条数据。

    1. taos> USE test;
    2. Database changed.
    3. taos> SHOW STABLES;
    4. name |
    5. =================================
    6. meters.current |
    7. meters.voltage |
    8. Query OK, 2 row(s) in set (0.002544s)
    9. taos> SELECT TBNAME, * FROM `meters.current`;
    10. tbname | _ts | _value | groupid | location |
    11. ==================================================================================================================================
    12. t_0e7bcfa21a02331c06764f275... | 2022-03-28 09:56:51.249 | 10.800000000 | 3 | California.LosAngeles |
    13. t_0e7bcfa21a02331c06764f275... | 2022-03-28 09:56:51.250 | 11.300000000 | 3 | California.LosAngeles |
    14. t_7e7b26dd860280242c6492a16... | 2022-03-28 09:56:51.249 | 10.300000000 | 2 | California.SanFrancisco |
    15. t_7e7b26dd860280242c6492a16... | 2022-03-28 09:56:51.250 | 12.600000000 | 2 | California.SanFrancisco |
    16. Query OK, 4 row(s) in set (0.005399s)

    可以通过超级表的 TAG 来过滤数据,比如查询 location=California.LosAngeles groupid=3 可以通过如下 SQL: