Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个集合值的Cassandra CQL where子句?_Cassandra_Cql_Cql3_Cassandra 2.1 - Fatal编程技术网

具有多个集合值的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};