【问题标题】:Pagination in apache cassandraapache cassandra中的分页
【发布时间】:2019-07-18 14:40:52
【问题描述】:

Cassandra 中的分页是如何实现的,我知道通过发送最后收到的 timestamp 我们将能够实现它。除此之外还有其他方法可以在 Cassandra 中实现分页吗?

另外,使用时间戳有一个限制,它只能帮助我们按插入顺序进行分页。

【问题讨论】:

  • 您是指数据表示的分页(例如在页面上),还是在处理大型结果集时作为驱动程序的实现细节的分页?
  • 对于 web 应用程序数据网格分页用例,例如 select * from user from 10 to 20

标签: cassandra pagination cassandra-3.0


【解决方案1】:

执行查询时可以传递一个页面状态的概念,查询将返回以“已知状态”开头的结果。 NodeJS 驱动程序公开为pageState 执行查询后返回的结果的属性 - 您可以将此状态存储在用户的会话(或网页本身)中,并通过将其放入选项中重用于下一个请求,例如(从文档中窃取):

const options = { pageState : pageState, prepare : true, fetchSize :  200 };
client.eachRow(query, parameters, options, function (n, row) { // Row callback.
 }, function (err, result) {       // End callback.
    // Store the next paging state.
    pageState = result.pageState;
 }
);

NodeJS driver documentation 提供了更多如何使用它的示例。您还可以查阅 Java driver 的文档 - 我相信它有更多关于页面状态的详细信息。

还有一些注意事项,例如,您不能跳转到任意页面,Cassandra 版本之间的状态可能不“兼容”(如果您进行滚动升级)等。

【讨论】:

  • 这就像苍蝇一样,谢谢。我存储了先前和当前的页面状态并按预期工作。同意 它不会让你跳。您认为在使用每一行和页面状态时会出现任何问题/性能问题吗?
  • 不应该——这是“标准”用例,应该进行优化。但请阅读 Java 文档 - 他们有更多关于如何正确使用它的详细信息
【解决方案2】:
$statement = new Cassandra\SimpleStatement("select * from tablename where id = ".$id); 
$result = $connection->execute($statement, new Cassandra\ExecutionOptions(array('page_size' => 5000)));

$result = $connection->execute($statement); 

while ($result) 
{ 
    foreach ($result as $row) 
    {
    } 
    if ($result->isLastPage()) 
    { 
        $page_size=$page_size+1; break; 
    }  
    $result = $result->nextPage(); 
}

【讨论】:

  • 你说的是 PagingState (Fetch_Size) 吗?我期待 Cassandra 中的分页用例
猜你喜欢
  • 2015-12-22
  • 2015-03-07
  • 2019-01-22
  • 2015-01-01
  • 2019-02-22
  • 2015-08-08
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多