从 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 容器开始):
- 创建 table
CREATE TABLE my_table(
location SYMBOL,
car_brand SYMBOL,
ts TIMESTAMP,
kmph FLOAT,
age INT
) timestamp(ts) PARTITION BY MONTH;
- 在 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 写入任何内容(table 之后没有任何行)并且不会引发任何错误
- 如果它没有写入,我预计会出现错误。
然后我想这可能与指定的时间戳/分区有关,所以我创建了一个新的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 具有 kmph
的 DOUBLE
列类型。 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
编辑:
int
和 float
类型可以按预期存储在 QuestDB 版本 6 中。数字的默认类型是 long
和 double
,但如果 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()
我的问题是我无法使用 Influx Line Protocol (ILP) 将数据写入 Quest DB,因为我已经创建了 table 模式。如果我有一个空的 table(即没有模式),那么我可以执行模式并且模式是自动创建的。
我的问题是:
- 为什么会这样?
- 如何让它工作(如果可能)?
下面我描述了我所做的(在 QuestDB server 5.0.6
上从 docker 容器开始):
- 创建 table
CREATE TABLE my_table(
location SYMBOL,
car_brand SYMBOL,
ts TIMESTAMP,
kmph FLOAT,
age INT
) timestamp(ts) PARTITION BY MONTH;
- 在 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 写入任何内容(table 之后没有任何行)并且不会引发任何错误
- 如果它没有写入,我预计会出现错误。
然后我想这可能与指定的时间戳/分区有关,所以我创建了一个新的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 具有 kmph
的 DOUBLE
列类型。 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
编辑:
int
和 float
类型可以按预期存储在 QuestDB 版本 6 中。数字的默认类型是 long
和 double
,但如果 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()