【问题标题】:Cassandra CQL method for paging through all rows用于对所有行进行分页的 Cassandra CQL 方法
【发布时间】:2012-08-03 16:42:06
【问题描述】:

我想以编程方式检查大型 cassandra 表中的所有行,并希望使用 CQL。我知道我可以用 thrift 来做到这一点,使用 multiget 一次获取 10,000(左右)行,并将最后检索到的密钥交给下一个 multiget 调用。但是我查看了有关 CQL select 的所有文档,似乎没有办法做到这一点。我已经将选择限制设置得越来越高,并将超时设置得越来越高以匹配它。

是否有一种未记录的方式可以将起点交给 CQL 选择,还是我只需要使用 thrift API 分解并重写我的代码?

【问题讨论】:

  • issues.apache.org/jira/browse/CASSANDRA-3771 非常有趣:'CQL = X" 变成 "token(key) >= token(X)"'..."唯一的理由对非 [B]OPP 执行此操作是对大型查询进行分页”...“作为一直使用 key >= X 和随机分区器来遍历结果的人”

标签: cassandra thrift cql


【解决方案1】:

检查这个:http://wiki.apache.org/cassandra/FAQ#iter_world

您需要手动对其进行编程,例如,每个后续查询都需要提供起点,这是上一个查询的最后一个结果。此起始端口将允许您创建切片查询,它返回有限数量的结果。

例如,您有具有以下列名称的行:

A1,A2,A3,B1,B2,B3,B4,B5,B6,C4,C5,D1,D2,D4,E2,E23,E4,E5,E6,E7

现在您想对其进行迭代,其中每个响应都有 3 个结果

切片 1) 开始:“”,结束:“”,限制:3 -> A1,A2,A3
切片 2) 开始:“A3”,结束:“”,限制:3 -> B1,B2,B3
切片 3) 开始:“B3”,结束:“”,限制:3 -> B4,B5,B6
切片 4) 开始:“B6”,结束:“”,限制:3 -> C4,C5,D1

【讨论】:

  • 是的,那个链接谈到了节俭的基础方法。
【解决方案2】:

结果大于和小于具有非常不直观但有用的行为(至少在 CQL2 中,我还没有检查 CQL3)。它实际上比较的是标记而不是键值。这是一个例子:

> create table users (KEY varchar PRIMARY KEY, data varchar);
> insert into users (KEY, 'data') values ('1', 'one');
> insert into users (KEY, 'data') values ('2', 'two');
> insert into users (KEY, 'data') values ('3', 'three');
> insert into users (KEY, 'data') values ('4', 'four');
> select * from users;
   3 | three
   2 |   two
   1 |   one
   4 |  four
> select * from users LIMIT 1;
   3 | three
> select * from users WHERE KEY > '3' LIMIT 1;
   2 |  two
> select * from users WHERE KEY > '2' LIMIT 1;
   1 |  one
> select * from users WHERE KEY > '1' LIMIT 1;
   4 | four

【讨论】:

  • 如果您明确使用 token 命令,它在 CQL3 中有效。例如。 select * from users where token(key) > token('3') limit 1;
  • 我们可以对辅助键做同样的事情吗?
猜你喜欢
  • 1970-01-01
  • 2016-04-08
  • 2015-11-09
  • 2015-02-22
  • 2015-04-24
  • 2015-01-01
  • 2015-03-24
  • 2014-10-18
  • 2018-09-27
相关资源
最近更新 更多