Reputation: 4255
My problem is that I cannot wrote data to Quest DB with Influx Line Protocol (ILP) is I have an already created table with a schema. If I have an empty table (i.e. with no schema) then I can do the schema and the schema is auto-created.
My questions are:
Below I describe what I do (on QuestDB server 5.0.6
started with a docker container):
CREATE TABLE my_table(
location SYMBOL,
car_brand SYMBOL,
ts TIMESTAMP,
kmph FLOAT,
age INT
) timestamp(ts) PARTITION BY MONTH;
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()
This creates two problems:
Then I thought maybe it has to do with the designated timestamp / partitioning, so I created a new table:
CREATE TABLE my_table_v2(
location SYMBOL,
car_brand SYMBOL,
ts TIMESTAMP,
kmph FLOAT,
age INT
);
Writing to it yield the same result - nothing was written.
Finally I created an empty table (no schema) I tried like this (but it did not work)
CREATE TABLE my_empty_table();
so I did a workaround like so;
CREATE TABLE my_empty_table(smth INT);
and then removed the column:
ALTER TABLE my_empty_table
DROP COLUMN smth;
Then when I wrote the data to the empty table - all worked as expected…
Ideally I would like to define the schema and then write to the table and ideally if it fails to write I’d like to capture this somehow.
Upvotes: 2
Views: 803
Reputation: 1315
The first python example throws an error in the QuestDB logs:
E i.q.c.l.t.LineTcpMeasurementScheduler mismatched column and value types [table=so_table, column=kmph, columnType=FLOAT, valueType=DOUBLE]
If the table has DOUBLE
column type for kmph
. age
will also throw a similar parsing error. The schema that you want to create is
CREATE TABLE new_ilp_table(
location SYMBOL,
timestamp TIMESTAMP,
car_brand SYMBOL,
kmph double,
age long
) timestamp(timestamp) PARTITION BY MONTH;
So the following types need to be changed:
FLOAT
-> DOUBLE
INT
-> LONG
For more information on the data types, see ILP data types documentation
And per the error above, you can have a look out for LineTcpMeasurementScheduler
in QuestDB logs
Edit:
int
and float
types can be stored as expected in version 6 of QuestDB. The default types for numerics are long
and double
but if a table is manually created with any equivalent type of lower resolution, this is handled as expected.
This is working with the beta version of 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 to create table
CREATE TABLE ilp_table(
location SYMBOL,
car_brand SYMBOL,
kmph FLOAT,
age INT,
ts TIMESTAMP
) timestamp(ts) PARTITION BY MONTH;
Python example to write to this 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()
Upvotes: 2