【问题标题】:Cassandra conditional update to collectionCassandra 有条件地更新集合
【发布时间】:2018-02-15 14:17:58
【问题描述】:

我有一个表,它是一个简单的键值存储,其中键是 uuid,值是 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”键,因为它带有较晚的时间戳。

这样的更新怎么写?

【问题讨论】:

  • 你需要在应用层做。

标签: collections cassandra cql cqlsh


【解决方案1】:

对 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;

这里的15049526469120002017-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 的值 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2016-08-10
    • 1970-01-01
    • 2018-11-13
    • 2019-07-10
    相关资源
    最近更新 更多