Как получить данные с форматом JSON в Clickhouse-драйвере - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь получить данные своего Clickhouse в моем проекте Django. Я использую clickhouse_driver и:

client.execute('SELECT * FROM myTable LIMIT 5 FORMAT JSON')

Когда я выполняю эту команду на моем сервере Clickhouse SELECT * FROM myTable LIMIT 5 FORMAT JSON, она выводится в формате JSON. Но в python, когда я пробую его с помощью clickhouse_driver, он выводит только такие поля, как:

[('2020213','qwerty','asdfg'),('2030103','qweasd','asdxv')]

Но я хочу ключ-значение json формат .. как

{"logdate":"2020213","host":"qwerty","cef":"asdfg"}

Есть предложения по решению этой проблемы? Или, может быть, мне нужно найти альтернативный clickhouse_driver ..

Thx.

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Я не пробовал Владимирское решение, но вот мое решение:

client.execute commands дает нам параметры " with_column_types = True " .. это дает нам метаданные для таблицы. after:

result , columns = client.execute('SELECT * FROM myTbl LIMIT 5',with_column_types=True)
df=pandas.DataFrame(result,columns=[tuple[0] for tuple in columns])
dfJson=df.to_json(orient='records')

, и это дает нам то, что мы хотим.

Спасибо за предложения :)

0 голосов
/ 04 августа 2020

clickhouse-driver игнорирует предложение FORMAT (см. Выбор данных ).

Это можно сделать вручную, объединив имя столбца со связанным значением:

from clickhouse_driver import Client
from json import dumps

client = Client(host='localhost')

data = client.execute_iter('SELECT * FROM system.functions LIMIT 5', with_column_types=True)
columns = [column[0] for column in next(data)]

for row in data:
    json = dumps(dict(zip(columns, [value for value in row])))
    print(f'''{json}''')

# Result:
# {"name": "fromUnixTimestamp64Nano", "is_aggregate": 0, "case_insensitive": 0, "alias_to": ""}
# {"name": "toUnixTimestamp64Nano", "is_aggregate": 0, "case_insensitive": 0, "alias_to": ""}
# {"name": "toUnixTimestamp64Micro", "is_aggregate": 0, "case_insensitive": 0, "alias_to": ""}
# {"name": "sumburConsistentHash", "is_aggregate": 0, "case_insensitive": 0, "alias_to": ""}
# {"name": "yandexConsistentHash", "is_aggregate": 0, "case_insensitive": 0, "alias_to": ""}

или используя pandas:

from clickhouse_driver import Client
import pandas as pd

client = Client(host='localhost')

data = client.execute_iter('SELECT * FROM system.functions LIMIT 5', with_column_types=True)
columns = [column[0] for column in next(data)]

df = pd.DataFrame.from_records(data, columns=columns)
print(df.to_json(orient='records'))
# Result 
# [{"name":"fromUnixTimestamp64Nano","is_aggregate":0,"case_insensitive":0,"alias_to":""},{"name":"toUnixTimestamp64Nano","is_aggregate":0,"case_insensitive":0,"alias_to":""},{"name":"toUnixTimestamp64Micro","is_aggregate":0,"case_insensitive":0,"alias_to":""},{"name":"sumburConsistentHash","is_aggregate":0,"case_insensitive":0,"alias_to":""},{"name":"yandexConsistentHash","is_aggregate":0,"case_insensitive":0,"alias_to":""}]
...