2014-02-03 3 views
0

Я только начал использовать pycassa, поэтому, если это глупый вопрос, я извиняюсь заранее.Невозможно прочитать семейство столбцов с использованием pycassa

У меня есть семья столбца со следующей схемой:

create column family MyColumnFamilyTest 
    with column_type = 'Standard' 
    and comparator = 'CompositeType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.TimeUUIDType)' 
    and default_validation_class = 'BytesType' 
    and key_validation_class = 'UTF8Type' 
    and read_repair_chance = 0.1 
    and dclocal_read_repair_chance = 0.0 
    and populate_io_cache_on_flush = false 
    and gc_grace = 864000 
    and min_compaction_threshold = 4 
    and max_compaction_threshold = 32 
    and replicate_on_write = true 
    and compaction_strategy = 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' 
    and caching = 'KEYS_ONLY' 
    and compression_options = {'sstable_compression' : 'org.apache.cassandra.io.compress.SnappyCompressor'}; 

Когда я пытаюсь сделать Get() с действительным ключом (отлично работает в Кассандре-АОН) я получаю:

Traceback (most recent call last): 
    File "<pyshell#19>", line 1, in <module> 
    cf.get('mykey',column_count=3) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 664, in get 
    return self._cosc_to_dict(list_col_or_super, include_timestamp, include_ttl) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 368, in _cosc_to_dict 
    ret[self._unpack_name(col.name)] = self._col_to_dict(col, include_timestamp, include_ttl) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 444, in _unpack_name 
    return self._name_unpacker(b) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/marshal.py", line 140, in unpack_composite 
    components.append(unpacker(bytestr[2:2 + length])) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/marshal.py", line 374, in <lambda> 
    return lambda v: uuid.UUID(bytes=v) 
    File "/usr/lib/python2.7/uuid.py", line 144, in __init__ 
    raise ValueError('bytes is not a 16-char string') 
ValueError: bytes is not a 16-char string 

Вот еще немного информации я обнаружил:

При использовании Кассандры CLI я могу видеть данные, как:

% Кассандры Cli -h 10.249.238.131

Connected to: "LocalDB" on 10.249.238.131/9160 
Welcome to Cassandra CLI version 1.2.10-SNAPSHOT 

Type 'help;' or '?' for help. 
Type 'quit;' or 'exit;' to quit. 

[[email protected]] use Keyspace; 
[[email protected]] list ColumnFamily; 
Using default limit of 100 
Using default cell limit of 100 
------------------- 
RowKey: urn:keyspace:ColumnFamily:a36e8ab1-7032-4e4c-a53d-e3317f63a640: 
=> (name=autoZoning:::, value=01, timestamp=1391298393966000) 
=> (name=creationTime:::, value=00000143efd8b76e, timestamp=1391298393966000) 
=> (name=inactive:::14fe78e0-8b9b-11e3-b171-005056b700bb, value=00, timestamp=1391298393966000) 
=> (name=label:::14fe78e0-8b9b-11e3-b171-005056b700bb, value=726a6d2d766e782d76613031, timestamp=1391298393966000) 

1 Row Returned. 
Elapsed time: 16 msec(s). 

Поскольку было неясно, что вызывает исключение, я решил добавить печать до осуществления возврата self._name_unpacker (б) "линии в columnfamily.py и я вижу:

>>> cf.get(dict(cf.get_range(column_count=0,filter_empty=False)).keys()[0]) 
Attempting to unpack: <00>\rautoZoning<00><00><00><00><00><00><00><00><00><00> 

Traceback (most recent call last): 
    File "<pyshell#172>", line 1, in <module> 
    cf.get(dict(cf.get_range(column_count=0,filter_empty=False)).keys()[0]) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 665, in get 
    return self._cosc_to_dict(list_col_or_super, include_timestamp, include_ttl) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 368, in _cosc_to_dict 
    ret[self._unpack_name(col.name)] = self._col_to_dict(col, include_timestamp, include_ttl) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 445, in _unpack_name 
    return self._name_unpacker(b) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/marshal.py", line 140, in unpack_composite 
    components.append(unpacker(bytestr[2:2 + length])) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/marshal.py", line 374, in <lambda> 
    return lambda v: uuid.UUID(bytes=v) 
    File "/usr/lib/python2.7/uuid.py", line 144, in __init__ 
    raise ValueError('bytes is not a 16-char string') 
ValueError: bytes is not a 16-char string 

Я понятия не имею, где дополнительные символы исходят от имени столбца. Но у меня любопытный, поэтому я добавил еще одну печати в _cosc_to_dict в columnfamily.py и я вижу:

>>> cf.get(dict(cf.get_range(column_count=0,filter_empty=False)).keys()[0]) 
    list_col_or_super is: [] 
    list_col_or_super is: [ColumnOrSuperColumn(column=Column(timestamp=1391298393966000, 
name='\x00\rautoZoning\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', value='\x01', ttl=None), 
counter_super_column=None, super_column=None, counter_column=None), 
ColumnOrSuperColumn(column=Column(timestamp=1391298393966000, 
name='\x00\x0ccreationTime\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 
value='\x00\x00\x01C\xef\xd8\xb7n', ttl=None), counter_super_column=None, super_column=None, 
counter_column=None), ColumnOrSuperColumn(column=Column(timestamp=1391298393966000, 
name='\x00\x08inactive\x00\x00\x00\x00\x00\x00\x00\x00\x10\x14\xfex\xe0\x8b\x9b\x11\xe3\xb1q\x00PV\xb7\x00\xbb\x00', value='\x00', ttl=None), counter_super_column=None, super_column=None, 
counter_column=None), ColumnOrSuperColumn(column=Column(timestamp=1391298393966000, 
name='\x00\x05label\x00\x00\x00\x00\x00\x00\x00\x00\x10\x14\xfex\xe0\x8b\x9b\x11\xe3\xb1q\x00PV\xb7\x00\xbb\x00', value='thisIsATest', ttl=None), counter_super_column=None, super_column=None, counter_column=None)] 
    autoZoning unpack: 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
     File "/usr/local/lib64/python2.6/site-packages/pycassa-1.11.0-py2.6.egg/pycassa/columnfamily.py", line 666, in get 
     return self._cosc_to_dict(list_col_or_super, include_timestamp, include_ttl) 
     File "/usr/local/lib64/python2.6/site-packages/pycassa-1.11.0-py2.6.egg/pycassa/columnfamily.py", line 369, in _cosc_to_dict 
     ret[self._unpack_name(col.name)] = self._col_to_dict(col, include_timestamp, include_ttl) 
     File "/usr/local/lib64/python2.6/site-packages/pycassa-1.11.0-py2.6.egg/pycassa/columnfamily.py", line 446, in _unpack_name 
     return self._name_unpacker(b) 
     File "/usr/local/lib64/python2.6/site-packages/pycassa-1.11.0-py2.6.egg/pycassa/marshal.py", line 140, in unpack_composite 
     components.append(unpacker(bytestr[2:2 + length])) 
     File "/usr/local/lib64/python2.6/site-packages/pycassa-1.11.0-py2.6.egg/pycassa/marshal.py", line 374, in <lambda> 
     return lambda v: uuid.UUID(bytes=v) 
     File "/usr/lib64/python2.6/uuid.py", line 144, in __init__ 
     raise ValueError('bytes is not a 16-char string') 
    ValueError: bytes is not a 16-char string 

Я правильно предполагая, что дополнительные символы вокруг имен столбцов то, что несет ответственность за «ValueError: байты не является исключением из 16-символьной строки?

Кроме того, если я пытаюсь использовать имя столбца и выберите его я получаю:

>>> cf.get(u'urn:keyspace:ColumnFamily:a36e8ab1-7032-4e4c-a53d-e3317f63a640:',columns=['autoZoning:::']) 

Traceback (most recent call last): 
    File "<pyshell#184>", line 1, in <module> 
    cf.get(u'urn:keyspace:ColumnFamily:a36e8ab1-7032-4e4c-a53d-e3317f63a640:',columns=['autoZoning:::']) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 651, in get 
    cp = self._column_path(super_column, column) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 383, in _column_path 
    self._pack_name(column, False)) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/columnfamily.py", line 426, in _pack_name 
    return self._name_packer(value, slice_start) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/marshal.py", line 115, in pack_composite 
    packed = packer(item) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/marshal.py", line 298, in pack_uuid 
    randomize=True) 
    File "/usr/local/lib/python2.7/dist-packages/pycassa-1.11.0-py2.7.egg/pycassa/util.py", line 75, in convert_time_to_uuid 
    'neither a UUID, a datetime, or a number') 
ValueError: Argument for a v1 UUID column name or value was neither a UUID, a datetime, or a number 

Любые дальнейшие мысли?

Спасибо,

Роб

+0

Итак, я создал семейство столбцов для тестирования и заметил, что ключ не ascii. В исходном семействе столбцов имена клавиш и столбцов - ascii. Как мне объяснить это с помощью get? –

+0

Возможно, вы хотите, чтобы ваши ключи были типами UTF-8. – Arya

+0

Хорошо, как мне это сделать? Если я хочу посмотреть, как представлен ключ, есть ли способ заставить pycassa перечислить ключи в семействе столбцов? –

ответ

0

Оказывается, что проблема была не с ключом, она была вызвана, в частности, ошибка в pycassa, что не обработки пустой (NULL) string в столбце UUID. Краткосрочное исправление в ответе в Google группах:

https://groups.google.com/d/msg/pycassa-discuss/Vf_bSgDIi9M/KTA1kbE9IXAJ

Другая часть ответа должен был получить в столбцах с помощью кортежей (с UUID как UUID, а не ул) вместо строки с разделителями ':', потому что это, как я узнал, вещь cassandra-cli.

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