2013-03-04 75 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) 

,你可以请参阅使用日期时间对象作为列名pycassa正确转换为timeUUID对象。

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

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

有时,应用程序需要更新一些数据。问题是,当我尝试更新该列,传递相同的日期时间对象时,pycassa创建了一个不同的UUID对象(时间部分是相同的),所以不是更新列而是创建另一个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) 

问题是,我怎样才能更新基于pycassa传递datetime对象的基于TimeUUID的列?或者,如果这不是正确的做法,建议的方法是什么?

回答

2

除非你做一个读 - 修改 - 写你不能。 UUID本质上是独一无二的。它们的存在是为了解决如何获得按时间顺序排序的唯一ID的问题,但同时避免发生在同一时间发生的事件的冲突。

因此,要更新该列,您需要先阅读该列,以便找到其列键,更改其值并将其重新写回。

这不是一个特别优雅的解决方案。您应该避免在Cassandra中进行读取 - 修改 - 写入。也许TimeUUID不适合你的列键?或者,您可以通过另一种方式设计应用程序,以避免返回并更改内容。

不知道你的查询模式是什么样子,我不能说你应该怎么做,而不是,但这里有一些建议,希望相关:

不更新值,只写新值。如果T时刻的事情是真的,那么即使它在时间T + 1时变化,对于T时刻也是如此。当事物发生变化时,你随着变化的时间写出一个新值,并让旧值变为。当你阅读时间线时,通过选取最近的值来解决这些冲突 - 由于这些值将按时间顺序排序,所以最近的值将始终是最后一个值。这与Cassandra在内部做事非常相似,而且是一个非常强大的模式。

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

可能有其他方法可以解决你的问题,如果你给我们更多的细节,也许我们可以想出更适合你的问题。

+0

谢谢你的回答。应用程序设计意味着有些时候,与行关联的值不是正确的,儿子更新它们是很有必要的,但是你的回应澄清了我要遵循的路径。谢谢。 – jcazor 2013-03-05 11:08:14