如何使用CQL3拉进一组复合列?
请考虑以下几点:
CREATE TABLE Stuff (
a int,
b text,
c text,
d text,
PRIMARY KEY (a,b,c)
);在Cassandra中,这有效地创建了一个包含整数行(a值)的ColumnFamily,以及由b和c的值以及字符串'd‘组成的CompositeColumns。当然,所有这些都被CQL3所掩盖,这样我们就会认为我们正在插入单个数据库行.但我离题了。
并考虑以下一组投入:
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','P','whatever0');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','Q','whatever1');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','R','whatever2');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','S','whatever3');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','T','whatever4');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','P','whatever5');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','Q','whatever6');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','R','whatever7');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','S','whatever8');
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','T','whatever9');在我当前的用例中,我想一次读取所有的n值。我该怎么做?下面是我使用n=4的最新照片
SELECT * FROM Stuff WHERE a=1 LIMIT 4;正如我所预料的那样:
a | b | c | d
---+---+---+-----------
1 | A | P | whatever0
1 | A | Q | whatever1
1 | A | R | whatever2
1 | A | S | whatever3我遇到的麻烦是如何得到下一个4?以下是我的尝试:
SELECT * FROM Stuff WHERE a=1 AND b='A' AND c>'S' LIMIT 4;这是行不通的,因为我们限制b等于'A‘-这是一个合理的做法!但是我在CQL3语法中没有发现任何允许我继续迭代的东西。我希望我能做这样的事:
SELECT * FROM Stuff WHERE a=1 AND {b,c} > {'A','S'} LIMIT 4;我怎样才能达到我想要的结果。也就是说,如何使CQL3返回:
a | b | c | d
---+---+---+-----------
1 | A | T | whatever0
1 | B | P | whatever1
1 | B | Q | whatever2
1 | B | R | whatever3发布于 2013-11-08 00:45:21
自动分页是https://issues.apache.org/jira/browse/CASSANDRA-4415,它发布到Cassandra2.0.1
发布于 2013-07-16 18:33:43
在阅读了CQL3文档之后,我还没有找到达到预期效果的方法。
但是,您可以使用一系列CQL查询来伪造所需的效果。考虑一下,我想一次浏览上面模型4中的项目。很容易得到前4名:
从a=1限制4中选择*;
但是,在一个查询中无法获得下一个4。但我可以分片做。以上查询的最后一项是
a | b | c | d
---+---+---+-----------
1 | A | S | whatever3因此,我可以发出一个查询,从这里开始并获取所有内容,直到b的下一个值。
从a=1中选择*,其中b='A‘和c>'S’极限4;
在本例中,我将得到一个CQL3行:
a | b | c | d
---+---+---+-----------
1 | A | T | whatever4(现在,如果我得到了4行,我就会达到极限,下一次我将从该集合的最后一个元素开始。但现在我只有一次争吵。)因此,为了得到剩下的部分,我从这个点迭代,得到剩下的3行:
SELECT * FROM a = 1 WHERE b > 'A' LIMIT 3;我继续使用同样的算法,直到我尽可能地递增扫描为止。
在上面的示例中,主键由3个元素组成,这意味着在Cassandra中的CQL中,列名是两个元素的CompositeColumns (基本上是...well,但这里的区别并不重要)。因为CompositeColumns是由2个元素组成的,所以您必须进行2个查询,就像我在这里演示的那样。但是,通常情况下,如果主键是n元素,那么您必须进行n-1查询才能伪造CQL表(即卡桑德拉行)的扫描。
更新:实际上,CQL3没有服务器端游标(请参阅"CQL3分页“部分这里),如果您想要伪造它,就必须使用上面描述的内容(请参阅文章作者阐述的基本想法)。
然而,有一个关于服务器端游标的JIRA问题,它将在Cassandra 2中可用,并且已经存在于Cassandra2Beta中。
还有一个相关的JIRA问题,它将使实现客户端游标更加容易,正如我前面所暗示的那样。但它仍未解决。
Update2:JIRA问题现在修好了。
现在可以使用元组/向量语法进行查询,其中(c1,c2) > (1,0)
发布于 2013-07-16 14:25:12
你要做的就是在卡桑德拉找到分页的东西。CQL3不支持这一点。您应该创建一个适合于比较的列,即小于,大于操作的列,并且该列应该形成递增/递减序列。事实上,正如jorgebg上面所注意到的,b+c的级联就是这样的。
https://stackoverflow.com/questions/17664438
复制相似问题