2015-10-15 17 views
1

У меня есть некоторые данные в hbase, хранящиеся как байты и строки, объединенные с помощью \ x00 padding.Python UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0x80 в позиции 74: недопустимый стартовый байт

Так строка в моей HBase выглядит следующим образом: -

00:00:00:00:00:00\x00\x80\x00\x00\x00U\xEF\xA0\xB00\x002\x0040.0.2.1\x00 

Существует значение, соответствующее этой строке (ключ), который является описание 100.

Row: -

00:00:00:00:00:00 - This is mac address and is a string 
\x80\x00\x00\x00U\xEF\xA0\xB00 - This is the time which is saved as bytes 
2 - this is customer id number stored as string 
40.0.2.1 - this is store ID stored as string 

Я использовал базовый модуль звезды для подключения python к его серверу звездных врагов.

Вот мой фрагмент кода для подключения к StarBase и к столу Hbase, и попытаться извлечения из значения этой строки: -

from starbase import Connection 
import starbase 

C = Connection(host='10.10.5.2', port='60010') 
get_table = C.table('dummy_table') 
mac_address = "00:00:00:00:00:00" 
time_start = "\x80\x00\x00\x00U\xEF\xA0\xB00" 
cus_id = "2" 
store_id = "40.0.2.1" 

create_query = "%s\x00%s\x00%s\x00%s\x00" % (mac,time_start,cus_id,store_id) 

fetch_result = get_table.fetch(create_query) 
print fetch_result 

Ожидаемый результат: -

100 

You не нужно беспокоиться о соединении с starbase и его методах. Они работают просто отлично, если все было строкой, но теперь со временем преобразуются в байты, он дает мне ошибку: -

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 74: invalid start byte 

Только в этом случае вы должны увидеть результат create_query, когда я распечатать его: -

00:00:1E:00:C8:36▒U▒v▒130.0.2.6 

Я был бы очень признателен за помощь. Спасибо

ответ

0

Попробуйте

time_start = "\\x80\\x00\\x00\\x00U\\xEF\\xA0\\xB00" 

\ х бежать последовательность для шестнадцатеричных значений,

create_query = "%s\x00%s\x00%s\x00%s\x00" % (mac,time_start,cus_id,store_id) 

было преобразование TIME_START в строку. И так как x80 недействителен utf-8, это порождает ошибку.

+0

Я пробовал ваше предложение, но это не сработало. Он не дает никаких ошибок, но дает ничего в качестве результатов. – Ray

+0

Попробуйте заменить все \ x00 на \\ x00 в create_query. – iamads

+0

Я тоже это пробовал. Даже это не работает @iamads – Ray

0

Я предполагаю, что ваша база данных не поддерживает сохранение байтов в этих полях; возможно, вы должны хранить строки.

Один из подходов состоит в том, чтобы преобразовать ваши байты в строки base64, прежде чем хранить их в базе данных. Например:

>>> from base64 import b64encode, b64decode 
>>> b64encode("\x80\x00\x00\x00U\xEF\xA0\xB00") 
'gAAAAFXvoLAw' 
>>> b64decode(_) 
'\x80\x00\x00\x00U\xef\xa0\xb00' 
+0

Hbase поддерживает сохранение байтов. Infact, сохраняющий данные в байтах, дает вам гораздо более быстрое сканирование результатов в hbase, чем строки. Именно по этой причине данные хранятся в байтах по строкам. – Ray

+0

@Ray, ну, в какой строке кода происходит ошибка? Если вы печатаете необработанные байты, не будет ли он неявно преобразовывать в unicode? – mpontillo

Смежные вопросы

 Смежные вопросы