Время UUID типа в Пикассе - PullRequest
       43

Время UUID типа в Пикассе

3 голосов
/ 12 сентября 2011

У меня проблемы с использованием типа time_uuid в качестве ключа в моей колонке.Я хочу сохранить свои записи и отсортировать их по времени, когда они были вставлены, а потом я решил, что time_uuid - это хороший путь.Вот как я настроил свое семейство столбцов:

sys.create_column_family("keyspace", "records", comparator_type=TIME_UUID_TYPE)

Когда я пытаюсь вставить, я делаю это:

q=pycassa.ColumnFamily(pycassa.connect("keyspace"), "records")
myKey=pycassa.util.convert_time_to_uuid(datetime.datetime.utcnow())
q.insert(myKey,{'somedata':'comevalue'})

Однако, когда я вставляю данные, я всегда получаюошибка:

Аргументом для имени или значения столбца UUID v1 v1 не было ни UUID, ни дата-время, ни число.

Если я изменяю тип_компаратора на UTF8_TYPE, он работает, но порядокиз предметов при возврате не так, как они должны быть.Что я делаю не так?

Ответы [ 2 ]

9 голосов
/ 12 сентября 2011

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

По этой причине большинство людей вставляют упорядоченные по времени данные, используя время в качестве имени столбца , а не ключа строки. В этой модели ваш оператор вставки будет выглядеть так:

q.insert(someKey, {datetime.datetime.utcnow(): 'somevalue'})

где someKey - это ключ, который относится ко всему вводимому вами временному ряду (например, к имени пользователя). (Обратите внимание, что вам не нужно преобразовывать время в UUID, pycassa сделает это за вас.) Чтобы сохранить нечто большее, чем одно значение, используйте суперколонку или составной ключ.

Если вы действительно хотите сохранить время в ключах строк, вам нужно указать key_validation_class, а не comparator_type. comparator_type устанавливает тип имен столбцов, тогда как key_validation_class устанавливает тип ключей строк.

sys.create_column_family("keyspace", "records", key_validation_class=TIME_UUID_TYPE)

Помните, что строки не будут отсортированы, если вы не используете ByteOrderedPartitioner.

3 голосов
/ 12 сентября 2011

Компаратор для семейства столбцов используется для упорядочения столбцов в каждой строке. Вы видите эту ошибку, потому что 'somedata' является допустимым utf-8, но не допустимым uuid.

Порядок строк, хранящихся в кассандре, определяется разделителем. Скорее всего, вы используете RandomPartitioner, который равномерно распределяет нагрузку по кластеру, но не допускает значимых запросов диапазона (строки будут возвращены в случайном порядке.)

http://wiki.apache.org/cassandra/FAQ#range_rp

...