关于墓碑的 Cassandra 地图和专栏更新
Cassandra map and column update regarding tombstones
我有以下内容table:
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';
我需要知道每个查询如何以逻辑删除和压缩的方式处理旧数据。
以下是我研究/建议的,但特别是关于我缺乏信息的地图。
删除键 = 'JOE' 处的映射条目,方法是仅为映射中的该条目生成墓碑。压缩时该值被删除。
将键值对插入映射。由于有更新的条目,旧条目在压缩时被删除。
列条目已更新,与 2 中一样,旧值在压缩中被删除
每种情况下的问题是,整行会再次写入还是只写入具有较新时间戳的更新值?
- 将插入
key = 'BOB'
的地图项的墓碑。
- 该行没有被覆盖。只需添加一个新的地图项。
- 严格来说,这不是
UPDATE
-- 将插入一个新列。 C* 中的所有突变都是隐藏的插入,即使是删除也是如此。
这里有一些额外的要点:
您的架构中有错字。应该是——users map<text,text>
.
对于 (1),您需要将该项括在大括号中,否则 CQL 语句无效 -- {'JOE'}
.
对于 (2),您需要一个冒号 (:
) 来分隔键和值 -- {'JOE':'meta'}
.
对于 (3),没有证据表明 lastvisit
已定义,因此将插入一个新列 lastvisit = 100
,并且没有要删除的旧值。干杯!
我有以下内容table:
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';
我需要知道每个查询如何以逻辑删除和压缩的方式处理旧数据。
以下是我研究/建议的,但特别是关于我缺乏信息的地图。
删除键 = 'JOE' 处的映射条目,方法是仅为映射中的该条目生成墓碑。压缩时该值被删除。
将键值对插入映射。由于有更新的条目,旧条目在压缩时被删除。
列条目已更新,与 2 中一样,旧值在压缩中被删除
每种情况下的问题是,整行会再次写入还是只写入具有较新时间戳的更新值?
- 将插入
key = 'BOB'
的地图项的墓碑。 - 该行没有被覆盖。只需添加一个新的地图项。
- 严格来说,这不是
UPDATE
-- 将插入一个新列。 C* 中的所有突变都是隐藏的插入,即使是删除也是如此。
这里有一些额外的要点:
您的架构中有错字。应该是——users map<text,text>
.
对于 (1),您需要将该项括在大括号中,否则 CQL 语句无效 -- {'JOE'}
.
对于 (2),您需要一个冒号 (:
) 来分隔键和值 -- {'JOE':'meta'}
.
对于 (3),没有证据表明 lastvisit
已定义,因此将插入一个新列 lastvisit = 100
,并且没有要删除的旧值。干杯!