【问题标题】:Cassandra map and column update regarding tombstones关于墓碑的 Cassandra 地图和列更新
【发布时间】:2021-10-19 07:22:30
【问题描述】:

我有这个下表:

CREATE TABLE example
(
    id text,
    users map<text,text>,
    lastvisit int,
    ...
    PRIMARY KEY (userid)
);

有时我会更新列或地图条目,例如:

1) update example set users = users - {'JOE'} where id = 'id';
2) update example set users = users + {'JOE':'meta'} where id = 'id';
3) update example set lastvisit = 100 where id = 'id';

我需要知道每个查询如何以墓碑和压缩的方式处理旧数据。

以下是我研究/建议的,但特别是在我缺乏信息的地图上。

  1. 通过仅为映射中的条目生成墓碑来删除 key = 'JOE' 处的映射条目。压缩时,该值将被删除。

  2. 将键值对插入映射。旧条目在压缩时被删除,因为有一个新条目。

  3. 列条目被更新,就像在 2 中一样,旧值在压缩中被删除

每种情况下的问题是,是重新写入整行还是只写入具有较新时间戳的更新值?

【问题讨论】:

    标签: cassandra cassandra-3.0 cql3 tombstone


    【解决方案1】:
    1. 将插入key = 'BOB' 的地图项的墓碑。
    2. 该行不会被覆盖。只需添加一个新地图项即可。
    3. 严格来说,它不是UPDATE——将插入一个新列。即使对于删除,C* 中的所有突变都是插入。

    这里有一些额外的点:

    您的架构中有错字。应该是——users map&lt;text,text&gt;

    对于 (1),您需要将项目括在大括号中,否则 CQL 语句无效 -- {'JOE'}

    对于 (2),您需要一个冒号 (:) 来分隔键和值 -- {'JOE':'meta'}

    对于 (3),没有证据表明已定义 lastvisit,因此将插入一个新列 lastvisit = 100,并且没有要删除的旧值。干杯!

    【讨论】:

    • 只是为了添加 - 地图的墓碑是在您进行完整插入或更新时创建的
    • 我同意@AlexOtt 的评论,尽管 (+) 和 (-) 运算符完全避免了这种情况。 ?
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2019-07-09
    • 2017-04-06
    • 2020-11-25
    • 2017-08-22
    • 2018-11-20
    • 2017-02-09
    • 2014-11-06
    相关资源
    最近更新 更多