我有一个表是一个简单的键值存储,其中键是uuid,value是UDT(用户定义类型)的映射。
示例行为JSON:
{
"id" = "123-123-12321",
"map" = {
"object1": {
"value": "1",
"timestamp": "2016-11-22 09:37:39.197000+0000"
},
"object2": {
"value": "2",
"timestamp": "2016-11-22 09:37:39.197000+0000"
}
}
}
我想仅在给定的更新对象具有更高的时间戳时才对地图中的一个对象执行更新,例如:
"object2": {
"value": "3",
"timestamp": "2011-10-11 23:13:42.321000+0000"
}
会覆盖地图中的“object2”键,因为它带有更晚的时间戳。
如何撰写此类更新?
答案 0 :(得分:0)
每次写入(插入/更新/删除)到cassandra,也会插入与每列关联的时间戳。当您执行读取查询时,时间戳用于选择"获胜"在单个列或集合元素中更新
Cassandra允许用户使用USING TIMESTAMP epoch_in_microseconds
显式设置该时间戳以及插入/更新/删除语句,该语句将用于选择"获胜"更新
那我们怎么能用呢?
每次插入/更新时间戳值转换为epoch_in_microseconds
并将其与USING TIMESTAMP converted_value
一起使用。
示例:
INSERT INTO data(id, map) VALUES('123-123-12321', {'object2' : {value : '2', timestamp : '2017-09-09 16:24:06.197000+0000'}}) USING TIMESTAMP 1504952646912000;
此处1504952646912000
是2017-09-09 16:24:06.197000+0000
和
UPDATE data SET map['object2'] = {value : '3', timestamp : '2017-09-09 16:08:42.197000+0000'} WHERE id = '123-123-12321' USING TIMESTAMP 1504951722676000;
最后,您的输出将是键object2