cassandra - 更新 cassandra 中的 TimeUUID 列

标签 cassandra pycassa 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)

有时,应用程序需要更新一些数据。问题是,当我尝试更新该列并传递相同的日期时间对象时,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)

问题是,如何使用传递日期时间对象的 pycassa 更新基于 TimeUUID 的列?或者,如果这不是正确的方法,那么推荐的方法是什么?

最佳答案

除非你执行读取-修改-写入操作,否则你不能。 UUID 本质上是唯一的。它们的存在是为了解决如何获取按时间顺序排序的唯一 ID 的问题,同时避免同时发生的事情发生冲突。

因此,要更新该列,您需要首先读取它,以便找到其列键、更改其值并再次写回。

这不是一个特别优雅的解决方案。您确实应该避免在 Cassandra 中进行读取-修改-写入。也许 TimeUUID 不是您的列键的正确类型?或者,也许还有另一种方法可以设计您的应用程序,以避免必须返回并更改内容。

在不知道您的查询模式是什么样子的情况下,我无法准确说出您应该做什么,但这里有一些希望相关的建议:

不更新值,只写入新值。如果某件事在时间 T 为真,则在时间 T 内始终为真,即使它在时间 T + 1 发生变化。当事情发生变化时,您可以根据变化的时间编写一个新值,并保留旧值。当您阅读时间线时,您可以通过选择最新的值来解决这些冲突 - 由于这些值将按时间顺序排序,因此最新的值将始终是最后一个。这与 Cassandra 内部的工作方式非常相似,而且是一个非常强大的模式。

不必担心这会占用更多磁盘空间,或者在读取时间序列时需要一些额外的 CPU,与您必须实现的读取-修改-写入复杂性相比,它很可能很小.

可能还有其他方法可以解决您的问题,如果您向我们提供更多详细信息,也许我们可以想出更适合的方法。

关于cassandra - 更新 cassandra 中的 TimeUUID 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15209708/

相关文章:

cassandra - 将批处理RDD中的结果与Apache Spark中的流式RDD合并

cassandra - Python 的最佳 Cassandra 1.2 驱动程序,我应该忘记 CQL 吗?

cassandra - Pycassa:如何查询复合类型的一部分

Cassandra 1.2 : Is CQL preferred over Thrift Based Clients

cassandra - pycassa 中的时间 UUID 类型

Cassandra 选择性复制

java - 如何使用 Astyanax 进行 Cassandra CQL 查询?

java - 如何在 Java/Scala 中生成 TimeUUID

java - Cassandra 在保存 java.util.UUID 时说 "InvalidQueryException: Invalid version for TimeUUID type"

Cassandra TimeUUID 字段的 Solr 映射