从 Influx Line Protocol 到 QuestDB 的问题写入

Issue writing from Influx Line Protocol to QuestDB

我的问题是我无法使用 Influx Line Protocol (ILP) 将数据写入 Quest DB,因为我已经创建了 table 模式。如果我有一个空的 table(即没有模式),那么我可以执行模式并且模式是自动创建的。

我的问题是:

下面我描述了我所做的(在 QuestDB server 5.0.6 上从 docker 容器开始):

  1. 创建 table
CREATE TABLE my_table(
    location SYMBOL,
    car_brand SYMBOL,
    ts TIMESTAMP,
    kmph FLOAT,
    age INT
) timestamp(ts)  PARTITION BY MONTH;
  1. 在 Python 然后我尝试写入 table
import time
import socket
HOST = 'localhost'
PORT = 9009
# For UDP, change socket.SOCK_STREAM to socket.SOCK_DGRAM
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    sock.connect((HOST, PORT))
    sock.send('my_table,location=london,car_brand=vw kmph=281.14000000,age=2 1420701827750051000\n'.encode())
except socket.error as e:
    print("Got error: %s" % (e))
sock.close()

这会产生两个问题:

然后我想这可能与指定的时间戳/分区有关,所以我创建了一个新的table:

CREATE TABLE my_table_v2(
    location SYMBOL,
    car_brand SYMBOL,
    ts TIMESTAMP,
    kmph FLOAT,
    age INT
);

写入它会产生相同的结果 - 没有写入任何内容。

最后我创建了一个空的 table(无模式) 我这样试过(但没用)

CREATE TABLE my_empty_table();

所以我做了这样的解决方法;

CREATE TABLE my_empty_table(smth INT);

然后删除了列:

ALTER TABLE my_empty_table
DROP COLUMN smth;

然后当我将数据写入空 table - 一切都按预期工作......

理想情况下,我想定义模式,然后写入 table,理想情况下,如果它无法写入,我想以某种方式捕获它。

第一个 python 示例在 QuestDB 日志中抛出错误:

E i.q.c.l.t.LineTcpMeasurementScheduler mismatched column and value types [table=so_table, column=kmph, columnType=FLOAT, valueType=DOUBLE]

如果 table 具有 kmphDOUBLE 列类型。 age 也会抛出类似的解析错误。您要创建的架构是

CREATE TABLE new_ilp_table(
    location SYMBOL,
    timestamp TIMESTAMP,
    car_brand SYMBOL,
    kmph double,
    age long
) timestamp(timestamp)  PARTITION BY MONTH;

因此需要更改以下类型:

  • FLOAT -> DOUBLE
  • INT -> LONG

有关数据类型的详细信息,请参阅 ILP data types documentation

根据上述错误,您可以在 QuestDB 日志

中查看 LineTcpMeasurementScheduler

编辑:

intfloat 类型可以按预期存储在 QuestDB 版本 6 中。数字的默认类型是 longdouble,但如果 table 是手动创建的,具有任何等效的较低分辨率类型,这将按预期处理。

这适用于 6.0 的 beta 版本:

docker pull questdb/questdb:6.0.0-beta-linux-amd64
docker run -p 9000:9000 -p 8812:8812 -p 9009:9009 \ 
questdb/questdb:6.0.0-beta-linux-amd64

SQL 创建 table

CREATE TABLE ilp_table(
    location SYMBOL,
    car_brand SYMBOL,
    kmph FLOAT,
    age INT,
    ts TIMESTAMP
) timestamp(ts)  PARTITION BY MONTH;

Python 写入此示例 table

import time
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
  sock.connect(('localhost', 9009))
  sock.send(('master_ilpf_table,location=london,car_brand=vw kmph=1.1,age=2i %d\n' %(time.time_ns())).encode())
except socket.error as e:
  print("Got error: %s" % (e))
sock.close()