Cassandra CQL3切片查询问题 - 如何进行切片

3

我有一张使用 CQL3 创建的表,其中包括:

create table compositetest(m_id ascii,i_id int,l_id ascii,body ascii,
  PRIMARY KEY(m_id,i_id,l_id));

插入了一些随机数据:

cqlsh:testkeyspace1> insert into compositetest(m_id,i_id,l_id,body) VALUES ('m1',1,'l1','b1');
cqlsh:testkeyspace1> insert into compositetest(m_id,i_id,l_id,body) VALUES ('m2',2,'l2','b2');
cqlsh:testkeyspace1> insert into compositetest(m_id,i_id,l_id,body) VALUES ('m1',2,'l2','b2');
cqlsh:testkeyspace1> insert into compositetest(m_id,i_id,l_id,body) VALUES ('m2',1,'l1','b1');
cqlsh:testkeyspace1> insert into compositetest(m_id,i_id,l_id,body) VALUES ('m3',3,'l1','b1');
cqlsh:testkeyspace1> insert into compositetest(m_id,i_id,l_id,body) VALUES ('m3',2,'l2','b2');
cqlsh:testkeyspace1> insert into compositetest(m_id,i_id,l_id,body) VALUES ('m3',1,'l2','b2');
cqlsh:testkeyspace1> select * from compositetest;

 m_id | i_id | l_id | body
------+------+------+------
   m1 |    1 |   l1 |   b1
   m1 |    2 |   l2 |   b2
   m2 |    1 |   l1 |   b1
   m2 |    2 |   l2 |   b2
   m3 |    1 |   l2 |   b2
   m3 |    2 |   l2 |   b2
   m3 |    3 |   l1 |   b1

当我执行查询时
cqlsh:testkeyspace1> select * from compositetest where i_id<=3 limit 3;

 m_id | i_id | l_id | body
------+------+------+------
   m1 |    1 |   l1 |   b1
   m1 |    2 |   l2 |   b2
   m2 |    1 |   l1 |   b1

现在,如果我想获取接下来的3行。
cqlsh:testkeyspace1> ?

我试图编写用于切片范围的CQL(不确定是否可行)

我的CQLSh显示套接字已关闭,并且我看到了错误。

TSocket read 0 bytes

在服务器端,我看到以下错误:

ERROR [Thrift:3] 2012-08-12 15:15:24,414 CustomTThreadPoolServer.java (line 204) Error occurred during processing of message.
java.lang.NullPointerException
    at org.apache.cassandra.cql3.statements.SelectStatement$Restriction.setBound(SelectStatement.java:1277)
    at org.apache.cassandra.cql3.statements.SelectStatement$RawStatement.updateRestriction(SelectStatement.java:1151)
    at org.apache.cassandra.cql3.statements.SelectStatement$RawStatement.prepare(SelectStatement.java:1001)
    at org.apache.cassandra.cql3.QueryProcessor.getStatement(QueryProcessor.java:215)
    at org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:121)
    at org.apache.cassandra.thrift.CassandraServer.execute_cql_query(CassandraServer.java:1237)
    at org.apache.cassandra.thrift.Cassandra$Processor$execute_cql_query.getResult(Cassandra.java:3542)
    at org.apache.cassandra.thrift.Cassandra$Processor$execute_cql_query.getResult(Cassandra.java:3530)
    at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:32)
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:34)
    at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:186)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

如何获取接下来的3行数据?关于服务器端异常问题,我会提交一个bug报告。CQLSh已关闭,我现在必须退出并重新连接。


1
使用Hector,我可以使用DynamicComposite并提供起始和结束范围来获取下一组列,但是在CQL3中我无法弄清楚。 - basu76
你的问题是追踪错误和连接失败吗?如果你没有提供导致这些问题的实际查询,很难确定是什么导致了这些问题。如果你只是想知道如何在切片范围内进行分页,你可以等待CASSANDRA-4415,或者将查询拆分成多个步骤,手动限制结果。嗯,这有点糟糕。 - the paul
我试图破坏查询,但对我来说没有起作用。 - basu76
1
我试图打破这个查询,但对我没有用。请注意,复合列由2部分组成,在hector中,您将最后返回的列指定为起始范围,同时保持结束范围相同(小于等于)。在cql3中,我无法做到这一点。1> select * from <cf> where i_id <=3 limit 3; -> 这将返回3条记录。因此,在CQL3中,您不能执行等效操作-> select * from <cf> where i_id=1 and l_id='l1' and i_id <=3(这只是不合逻辑的)。这将使cqlsh关闭连接。 - basu76
你为什么想尝试做 "i_id=1 and (...) i_id <= 3"?你想通过分页获取的实际查询是什么? - the paul
假设我有一个宽行,其中有100列。我想一次获取10列,并且每次获取下一个10列,第一列是上一批的最后一列(这是使用thrift/hector可能实现的),直到满足条件为止。总体查询将是select * from <cf> where i_id < [some number] LIMIT 10; 第二个查询将需要修改以获取下一个10个。使用thrift/hector,上一个查询的最后一行成为下一个查询的起始范围,而结束范围保持不变,直到没有更多行可获取。 - basu76
1个回答

0

CQL从CQL2版本及以上就具有所谓的“自动分页”功能。简而言之,你所描述的已经由驱动程序处理。

当您的代码请求新行时,服务器仅发送查询的下一行,而不是整个结果。同样,您可以告诉它返回任意行数。

在数据库术语中,您执行查询并获取光标。然后,您告诉光标获取N行数据,服务器会返回这些行(而不是整个结果集)。

一旦没有更多行返回,光标就完成了。

在cqlsh中,当遍历到那一点时,自动显示最多1k行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接