Как решить проблему с кодировкой python и clickhouse?
Подключаюсь в python к бд clickhouse через clickhouse_connect и при записи результата запроса в датафрейм появляется ошибка UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfe in position 0: invalid start byte
Код записи:
client = clickhouse_connect.get_client(...)
df=pd.DataFrame(client.query('select * from table', encoding = 'utf8').result_set,
columns=['id', 'column_1','column_2'])
Пробовал менять значение параметра encoding на windows-1251, ISO-8859-1 и пр., но ошибка сохраняется
Код ошибки:
UnicodeDecodeError Traceback (most recent call last)
Cell In[66], line 1
1 df=pd.DataFrame(client.query('select * from table', encoding = 'utf8').result_set,
2 columns=['id', 'column_1','column_2'])
File ~/anaconda3/lib/python3.11/site-packages/clickhouse_connect/driver/query.py:254, in QueryResult.result_set(self)
252 if self.column_oriented:
253 return self.result_columns
--> 254 return self.result_rows
File ~/anaconda3/lib/python3.11/site-packages/clickhouse_connect/driver/query.py:272, in QueryResult.result_rows(self)
270 result = []
271 with self.row_block_stream as stream:
--> 272 for block in stream:
273 result.extend(block)
274 self._result_rows = result
File ~/anaconda3/lib/python3.11/site-packages/clickhouse_connect/driver/common.py:195, in StreamContext.__next__(self)
193 if not self._in_context:
194 raise ProgrammingError('Stream should be used within a context')
--> 195 return next(self.gen)
File ~/anaconda3/lib/python3.11/site-packages/clickhouse_connect/driver/query.py:292, in QueryResult._row_block_stream(self)
291 def _row_block_stream(self):
--> 292 for block in self._column_block_stream():
293 yield list(zip(*block))
File ~/anaconda3/lib/python3.11/site-packages/clickhouse_connect/driver/transform.py:75, in NativeTransform.parse_response.<locals>.gen()
73 yield first_block
74 while True:
---> 75 next_block = get_block()
76 if next_block is None:
77 return
File ~/anaconda3/lib/python3.11/site-packages/clickhouse_connect/driver/transform.py:38, in NativeTransform.parse_response.<locals>.get_block()
36 num_rows = source.read_leb128()
37 for col_num in range(num_cols):
---> 38 name = source.read_leb128_str()
39 type_name = source.read_leb128_str()
40 if block_num == 0:
File clickhouse_connect/driverc/buffer.pyx:200, in clickhouse_connect.driverc.buffer.ResponseBuffer.read_leb128_str()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfe in position 0: invalid start byte
Ответы (1 шт):
Автор решения: darsa
→ Ссылка
Если огромное кол-во данных, то это похоже на проблему, описанную в этом issue.
Как решение можно поставить compress = False
при создании клиента:
client = clickhouse_connect.get_client(..., compress = False)