【问题标题】:how can we page results from a select query in cassandra我们如何从 cassandra 中的选择查询中分页结果
【发布时间】:2015-03-25 10:37:49
【问题描述】:

我有一个超过 200 万行的 cassandra 表。我需要获取我的结果并将它们分页。 如何从选择查询中分页我的结果。

当我尝试检索 1M 行时,rpc 超时。

【问题讨论】:

  • 取决于你使用什么,但你应该有一个limit 方法
  • 你用的是什么客户端? CQL 3+ 支持使用内部分页状态进行分页。所有 datastax 驱动程序和大多数其他实现本机协议的客户端都将根据您的获取大小进行分页。

标签: cassandra cql


【解决方案1】:

在 cqlsh 命令提示符下,一种方法是通过 token 函数限制散列分区键值。假设我有一个跟踪船员的表(crewname 作为我的分区键):

aploetz@cqlsh:presentation> SELECT crewname,token(crewname),firstname,lastname 
FROM crew;

 crewname | token(crewname)      | firstname | lastname
----------+----------------------+-----------+-----------
    Simon | -8694467316808994943 |     Simon |       Tam
    Jayne | -3415298744707363779 |     Jayne |      Cobb
     Wash |   596395343680995623 |     Hoban | Washburne
      Mal |  4016264465811926804 |   Malcolm |  Reynolds
     Zoey |  7853923060445977899 |      Zoey | Washburne
 Sheppard |  8386579365973272775 |    Derial |      Book

(6 rows)

如果我只想将 Jayne 的所有船员带回 Zoey(包括),我可以运行如下查询:

aploetz@cqlsh:presentation> SELECT crewname,token(crewname),firstname,lastname 
FROM crew WHERE token(crewname) >= token('Jayne') AND token(crewname) <= token('Zoey');

 crewname | token(crewname)      | firstname | lastname
----------+----------------------+-----------+-----------
    Jayne | -3415298744707363779 |     Jayne |      Cobb
     Wash |   596395343680995623 |     Hoban | Washburne
      Mal |  4016264465811926804 |   Malcolm |  Reynolds
     Zoey |  7853923060445977899 |      Zoey | Washburne

(4 rows)

您也应该能够对分区键值执行类似的操作。

否则,您可能可以使用其中一个驱动程序来完成此操作。在她的文章Things You Should Be Doing When Using Cassandra Drivers DataStax 的 Rebecca Mills 中描述了如何使用setFetchSize 对大型结果集进行分页(她的示例如下):

Statement stmt = new SimpleStatement("select * FROM raw_weather_data WHERE wsid= '725474:99999' AND year = 2005 AND month = 6");
stmt.setFetchSize(24);
ResultSet rs = session.execute(stmt);
Iterator<Row> iter = rs.iterator();
while (!rs.isFullyFetched()) {
   rs.fetchMoreResults();
   Row row = iter.next();
   System.out.println(row);
}

【讨论】:

  • 这仅适用于多分区范围查询,不是吗?如果 subbu 在同一个分区中有 200 万行,这将不起作用(除非我弄错了)
  • @AndyTolbert 是的。如果 OP 在一个分区中存储了许多 CQL 行,这仍然会分页,但你是对的,它的有效性会降低。当然,除非所有 200 万行都在同一个分区中,否则它不会做任何事情。如果是这样的话,他的表现会因为热点而受到影响。
  • @AndyTolbert 你们都是对的。我想我将 cassandra 用于它无法解决的用例。
猜你喜欢
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2017-02-04
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多