Cassandra中如何向frozen类型集合字段添加新值?
解决Cassandra Frozen集合无法增量更新的问题
首先得说清楚为什么你会遇到这个错误:Cassandra里的frozen类型集合是不可变的——一旦写入到数据库,你就没法单独修改它里面的元素或者添加新的键值对,必须把整个集合完整替换才行。你用的+操作符是给可变集合(比如普通的map)做增量更新用的,对frozen集合完全不适用,所以才会触发那个错误。
下面给你两种解决思路:
思路1:整体替换Frozen集合(适合临时修改)
如果只是偶尔需要更新这个字段,你可以按照以下步骤操作:
- 第一步,先查询出当前
components的完整值:SELECT components FROM kp.users WHERE user_id='edf29208-adc5-4dc0-b6c4-b53b28cab95c'; - 第二步,把查询到的现有数据和你要添加的新内容合并成一个完整的Map。比如你查到现有值是
{'old_key': {'sub_key': 'old_val'}},那合并后就是{'old_key': {'sub_key': 'old_val'}, 'new': {'key': 'value'}}。 - 第三步,用合并后的完整Map执行更新,替换整个
components字段:UPDATE kp.users SET components = {'old_key': {'sub_key': 'old_val'}, 'new': {'key': 'value'}} WHERE user_id='edf29208-adc5-4dc0-b6c4-b53b28cab95c';
思路2:修改表结构,去掉Frozen(适合频繁更新场景)
如果你的业务需要经常给这个Map添加新内容,那更彻底的解决办法是修改表结构,把frozen修饰符去掉:
ALTER TABLE kp.users ALTER components TYPE map<text, map<text, text>>;
修改完成后,你原来的增量更新语句就可以正常执行了:
UPDATE kp.users SET components = components + {'new': {'key':'value'}} WHERE user_id='edf29208-adc5-4dc0-b6c4-b53b28cab95c';
不过要注意:修改表结构会涉及到数据的重写,如果你这张表数据量很大,最好在业务低峰期操作,避免影响性能。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

