具有多个集合值的Cassandra CQL where子句?
我的数据模型:-具有多个集合值的Cassandra CQL where子句?,cassandra,cql,cql3,cassandra-2.1,Cassandra,Cql,Cql3,Cassandra 2.1,我的数据模型:- tid | codes | raw | type -------------------------------------+--------------+--------------+------ a64fdd60-1bc4-11e5-9b30-3dca08b6a366 | {12, 34, 53} | {sdafb=safd} | cmd CREATE TABLE MyTa
tid | codes | raw | type
-------------------------------------+--------------+--------------+------
a64fdd60-1bc4-11e5-9b30-3dca08b6a366 | {12, 34, 53} | {sdafb=safd} | cmd
CREATE TABLE MyTable (
tid TIMEUUID,
type TEXT,
codes SET<INT>,
raw TEXT,
PRIMARY KEY (tid)
);
CREATE INDEX ON myTable (codes);
但我想基于多个集合值获取行,但这些都不起作用:-
select * from logData where codes contains 34;
select * from logData where codes contains 34, 12; or
select * from logData where codes contains 34 and 12; or
select * from logData where codes contains {34, 12};
请协助。您使用的数据模型效率极低。集合用于获取给定主键的一组数据,而不是相反。如果这就是所需要的,你就必须重新思考模型本身
我建议为集合中使用的每个值创建不同的列,然后将这些列用作复合主键。您真的希望仅基于代码获取所有日志条目吗?这可能是一个相当大的数据集。事实上,你不是在看具体的日期/日期范围吗?我会输入这些代码,然后使用代码进行过滤,甚至完全在客户端对代码进行过滤 如果您有许多代码,并且对集合进行索引,则可能会导致索引的基数非常高,这将导致出现问题。无论您有自己的查找表,还是使用索引,请记住,实际上您有一个“表”,其中pk是值,并且每个与该值匹配的“行”都有对应该值的行。如果它看起来大得让人无法接受,那么它就是这样 我建议您重新审视这个需求——再说一遍……您真的需要所有与特定代码组合匹配的日志条目吗
如果你真的需要分析整个过程,那么我建议使用Spark来运行这项工作。然后,您可以运行Spark作业,每个节点将处理同一节点上的数据;与完全在应用程序中执行完整的表处理相比,这将显著减少影响。如果我创建了您的表结构并插入了与上面类似的行,我可以在
code
集合中检查多个值,如下所示:
aploetz@cqlsh:stackoverflow2> SELECT * FROM mytable
WHERE codes CONTAINS 34
AND codes CONTAINS 12
ALLOW FILTERING;
tid | codes | raw | type
--------------------------------------+--------------+--------------+------
2569f270-1c06-11e5-92f0-21b264d4c94d | {12, 34, 53} | {sdafb=safd} | cmd
(1 rows)
现在,正如其他人所提到的,让我也告诉你为什么这是一个糟糕的想法
对于集合上的二级索引(基数似乎相当高),每个查询都必须检查每个节点。Cassandra的想法是尽可能多地按分区键进行查询,这样每次查询只需点击一个节点。苹果的理查德·洛(Richard Low)写了一篇很棒的文章,名为。它应该让你重新思考你使用二级索引的方式
其次,我能让卡桑德拉接受这个查询的唯一方法是使用。这意味着,Cassandra应用所有fitlering条件(WHERE子句)的唯一方法是收回每一行,并单独筛选出不符合条件的行。效率极低。需要明确的是,ALLOW FILTERING指令是您永远不应该使用的
在任何情况下,如果您需要使用
code
进行查询,那么您应该设计一个附加的查询表,将code
作为主键的一部分。我知道已经很晚了。国际海事组织认为,只要稍作改动,这种模式就足以实现预期目标。我们所能做的就是拥有和被查询集的幂集成员一样多的行
CREATE TABLE data_points_ks.mytable (
codes frozen<set<int>>,
tid timeuuid,
raw text,
type text,
PRIMARY KEY (codes, tid)
) WITH CLUSTERING ORDER BY (tid ASC)
INSERT INTO mytable (tid, codes, raw, type) VALUES (now(), {}, '{sdafb=safd}', 'cmd');
INSERT INTO mytable (tid, codes, raw, type) VALUES (now(), {12}, '{sdafb=safd}', 'cmd');
INSERT INTO mytable (tid, codes, raw, type) VALUES (now(), {34}, '{sdafb=safd}', 'cmd');
INSERT INTO mytable (tid, codes, raw, type) VALUES (now(), {12, 34}, '{sdafb=safd}', 'cmd');
INSERT INTO mytable (tid, codes, raw, type) VALUES (now(), {53}, '{sdafb=safd}', 'cmd');
INSERT INTO mytable (tid, codes, raw, type) VALUES (now(), {12, 53}, '{sdafb=safd}', 'cmd');
INSERT INTO mytable (tid, codes, raw, type) VALUES (now(), {34, 53}, '{sdafb=safd}', 'cmd');
INSERT INTO mytable (tid, codes, raw, type) VALUES (now(), {12, 34, 53}, '{sdafb=safd}', 'cmd');
tid | codes | raw | type
--------------------------------------+--------------+--------------+------
8ae81763-1142-11e8-846c-cd9226c29754 | {34, 53} | {sdafb=safd} | cmd
8746adb3-1142-11e8-846c-cd9226c29754 | {12, 53} | {sdafb=safd} | cmd
fea77062-1142-11e8-846c-cd9226c29754 | {34} | {sdafb=safd} | cmd
70ebb790-1142-11e8-846c-cd9226c29754 | {12, 34} | {sdafb=safd} | cmd
6c39c843-1142-11e8-846c-cd9226c29754 | {12} | {sdafb=safd} | cmd
65a954f3-1142-11e8-846c-cd9226c29754 | null | {sdafb=safd} | cmd
03c60433-1143-11e8-846c-cd9226c29754 | {53} | {sdafb=safd} | cmd
82f68d70-1142-11e8-846c-cd9226c29754 | {12, 34, 53} | {sdafb=safd} | cmd
或
SELECT * FROM mytable
WHERE codes = {12, 34};
SELECT * FROM mytable
WHERE codes = {34};