The clickhouse http interface uses TSV(tab separated) as the default response format.
CREATE TABLE users (uid Int16, name String, age Int16) ENGINE=Memory;
INSERT INTO users VALUES (1231, 'John', 33);
INSERT INTO users VALUES (6666, 'Ksenia', 48);
INSERT INTO users VALUES (8888, 'Alice', 50);
SELECT * FROM users;
The server response:
{
"result": {
"query_run_id": "0180af8f-c9c4-41c7-be52-011a96cc1768",
"output": "1231\tJohn\t33\n8888\tAlice\t50\n6666\tKsenia\t48\n",
"time_elapsed": "117ms"
}
}
Changing the format allows the response to be easily parsed or loaded into js/python objects.
Change the query to
SELECT * FROM users FORMAT JSON;
This outputs:
{
"result": {
"query_run_id": "26732a8a-aac9-4de7-b71a-4e1f35032c17",
"output": "{\n\t\"meta\":\n\t[\n\t\t{\n\t\t\t\"name\": \"uid\",\n\t\t\t\"type\": \"Int16\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"name\",\n\t\t\t\"type\": \"String\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"age\",\n\t\t\t\"type\": \"Int16\"\n\t\t}\n\t],\n\n\t\"data\":\n\t[\n\t\t{\n\t\t\t\"uid\": 1231,\n\t\t\t\"name\": \"John\",\n\t\t\t\"age\": 33\n\t\t},\n\t\t{\n\t\t\t\"uid\": 6666,\n\t\t\t\"name\": \"Ksenia\",\n\t\t\t\"age\": 48\n\t\t},\n\t\t{\n\t\t\t\"uid\": 8888,\n\t\t\t\"name\": \"Alice\",\n\t\t\t\"age\": 50\n\t\t}\n\t],\n\n\t\"rows\": 3,\n\n\t\"statistics\":\n\t{\n\t\t\"elapsed\": 0.000923364,\n\t\t\"rows_read\": 3,\n\t\t\"bytes_read\": 54\n\t}\n}\n",
"time_elapsed": "106ms"
}
}
Now, you can parse the value of output
and get the data
key.
JSON.parse(clickhouse_response["result"]["output"])["data"];
returns
[
{
"uid": 1231,
"name": "John",
"age": 33
},
{
"uid": 6666,
"name": "Ksenia",
"age": 48
},
{
"uid": 8888,
"name": "Alice",
"age": 50
}
]
Check out all the supported clickhouse formats here
To set JSON
as the default response format in the clickhouse HTTP interface, pass default_format=JSON
as a query parameter. This should be handled automatically if you're using a clickhouse client library.
Top comments (0)