2013-03-04 2 views
2

Я пытаюсь сохранить некоторые данные временных рядов на следующую семьи колонки:Обновление столбцов TimeUUID в Кассандре

create column family t_data with comparator=TimeUUIDType and default_validation_class=UTF8Type and key_validation_class=UTF8Type; 

Я успешно вставки данных таким образом:

data={datetime.datetime(2013, 3, 4, 17, 8, 57, 919671):'VALUE'} 
key='row_id' 
col_fam.insert(key,data) 

Как вы можете см., используя объект datetime, поскольку имя столбца pycassa правильно преобразуется в объект timeUUID.

[[email protected]] get t_data[row_id]; 

=> (column=f36ad7be-84ed-11e2-af42-ef3ff4aa7c40, value=VALUE, timestamp=1362423749228331) 

Иногда приложение должно обновление некоторых данных. Проблема заключается в том, что когда я пытаюсь обновить этот столбец, передавая один и тот же объект datetime, pycassa создает другой объект UUID (часть времени такая же), поэтому вместо обновления столбца создается другое.

[[email protected]] get t_data[row_id]; 

=> (column=f36ad7be-84ed-11e2-af42-ef3ff4aa7c40, value=VALUE, timestamp=1362423749228331) 

=> (column=**f36ad7be**-84ed-11e2-b2fa-a6d3e28fea13, value=VALUE, timestamp=1362424025433209) 

Вопрос в том, как я могу обновить столбцы на основе TimeUUID с помощью pycassa, передающего объект datetime? или, если это не правильный способ сделать это, что рекомендуется?

ответ

2

Если вы не читаете-модифицируете-пишите, вы не можете. UUID по своей природе уникальны. Они существуют, чтобы решить проблему получения уникальных идентификаторов, которые сортируются в хронологическом порядке, но в то же время избегают столкновений для вещей, которые происходят точно в одно и то же время.

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

Это не очень элегантное решение. Вы действительно должны избегать чтения-изменения-записи в Кассандре. Возможно, TimeUUID не подходит для ваших ключей столбца? Или, возможно, есть другой способ, которым вы можете разработать свое приложение, чтобы избежать необходимости возвращаться и менять вещи.

Не зная, что ваши шаблоны запросов выглядеть, я не могу точно сказать, что вы должны делать вместо этого, но вот несколько советов, которые, надеюсь, являются релевантными:

Не обновлять значения, просто записать новые значения. Если бы что-то было истинным в момент времени T, то всегда было бы верно для времени T, даже если оно изменяется в момент времени T + 1. Когда все меняется, вы записываете новое значение со временем изменения и ставите старые значения. Когда вы читаете временную линию, вы разрешаете эти конфлики, выбирая самое последнее значение - и поскольку значения будут отсортированы в хронологическом порядке, последнее значение всегда будет последним. Это очень похоже на то, как Cassandra делает вещи внутри себя, и это очень мощный образец.

Не беспокойтесь, что при чтении временных рядов это потребует большего объема дискового пространства или потребует некоторого дополнительного процессора, это, скорее всего, будет крошечным по сравнению с сложностью чтения-изменения-записи, которую вам в противном случае пришлось бы воплощать в жизнь.

Возможно, существуют другие способы решения вашей проблемы, и если вы дадите нам более подробную информацию, возможно, мы сможем придумать что-нибудь подходящее.

+0

Благодарим вас за ответ. Дизайн приложения подразумевает, что значения, связанные с строкой, не являются правильными, но необходимо, чтобы они обновили их ... но ваш ответ прояснит мне путь к следующему, чтобы сделать это. Спасибо. – jcazor

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