2

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

我的问题是:

  • 为什么会这样?
  • 我怎样才能让它工作(如果可能的话)?

下面我描述了我的工作(QuestDB server 5.0.6从 docker 容器开始):

  1. 创建表
CREATE TABLE my_table(
    location SYMBOL,
    car_brand SYMBOL,
    ts TIMESTAMP,
    kmph FLOAT,
    age INT
) timestamp(ts)  PARTITION BY MONTH;
  1. 然后在 Python 中我尝试写入表
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()

这会产生两个问题:

  • 它不会向表中写入任何内容(在此之后表中没有任何行)并且不会引发任何错误
  • 如果它无法写入,我预计会出现错误。

然后我想也许它与指定的时间戳/分区有关,所以我创建了一个新表:

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

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

最后我创建了一个空表(无模式)我尝试过这样(但它不起作用)

CREATE TABLE my_empty_table();

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

CREATE TABLE my_empty_table(smth INT);

然后删除列:

ALTER TABLE my_empty_table
DROP COLUMN smth;

然后当我将数据写入空表时 - 一切都按预期工作......</p>

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

4

1 回答 1

2

第一个 python 示例在 QuestDB 日志中引发错误:

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

如果表的DOUBLE列类型为kmph. 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 数据类型文档

根据上述错误,您可以LineTcpMeasurementScheduler在 QuestDB 日志中查看

编辑:

int并且float类型可以按预期存储在 QuestDB 版本 6 中。数字的默认类型是longdouble但是如果使用任何等效类型的较低分辨率手动创建表,则会按预期处理。

这适用于 6.0 的测试版:

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 创建表

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

写入此表的 Python 示例

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()
于 2021-04-29T13:51:43.030 回答