Обновление столбцов 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.

[default@keyspace] get t_data[row_id];

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

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

[default@keyspace] 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? или, если это не правильный способ, каков рекомендуемый способ?

1 ответ

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам