如何解决cassandra:搜索字段类型集为空的记录
我需要为 cassndra 做这个查询:
select * from classes where students = null allow filtering;
学生是一组
但看起来 set 不允许 = 运算符。
解决方法
为了对此进行测试,我遵循了 Indexing a Collection 上的 DataStax 文档。
> CREATE TABLE cyclist_career_teams ( id UUID PRIMARY KEY,lastname text,teams set<text> );
> CREATE INDEX team_idx ON cyclist_career_teams ( teams );
创建了表并在 teams
集上建立了二级索引,然后我插入了一些测试数据:
> SELECT lastname,teams FROM cyclist_career_teams ;
lastname | teams
-----------------+---------------------------------------------------------------------------------------------------------
Vos | {'Neiderland bloeit','Rabobank Womens Team','Rabobonk-Liv Giant','Rabobonk-Liv Womens Cycling Team'}
Van Der Breggen | {'Rabobonk-Liv Womens Cycling Team','Sengers Ladies Cycling Team','Team Flexpoint'}
Brand | {'AA Drink - Leontien.nl','Rabobonk-Liv Womens Cycling Team'}
Armistead | null
请注意,对于 Lizzie Armistead,我有意省略了 teams
列的值。虽然 CQL 不允许集合类型上的等于“=”关系,但它确实允许 CONTAINS
。但是,尝试将其与 null
一起使用会产生不同的错误:
> SELECT lastname,teams FROM cyclist_career_teams WHERE teams CONTAINS null;
[Invalid query] message="Unsupported null value for column teams"
这种行为的原因与 Cassandra 如何对空值和 "null" 关键字进行一些特殊处理有关。本质上,写入 null 会创建一个墓碑,这是 Cassandra 的结构,表示删除。
即使 Cassandra 对 null 的处理不是一个因素,您仍然会面临这样一个问题,即“null”的值不是唯一的,并且您的查询必须轮询集群中的每个节点强>。此类用例是众所周知的反模式。不幸的是,Cassandra 只是不擅长查询不存在的数据(或过滤键值)。
您可以尝试的一件事是使用字符串文字来表示空值,如下所示:
> INSERT INTO cyclist_career_teams (id,lastname) VALUES (uuid(),'Armistead',{'empty'});
> SELECT lastname,teams FROM cyclist_career_teams WHERE teams CONTAINS 'empty';
lastname | teams
-----------+-----------
Armistead | {'empty'}
(1 rows)
老实说,由于上述反模式,我不能真诚地推荐这种方法。但是在创建时添加一些应用程序逻辑,“空”字符串文字可能适合您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。