【问题标题】:Need pagination for following Cassandra table跟随 Cassandra 表需要分页
【发布时间】:2020-08-27 09:33:12
【问题描述】:
CREATE TABLE feed (
   identifier text,
   post_id int,
   score int,
   reason text,
   timestamp timeuuid,
   PRIMARY KEY ((identifier, post_id), score, id, timestamp)
) WITH CLUSTERING ORDER BY (score DESC, timestamp DESC);

CREATE INDEX IF NOT EXISTS index_identifier ON feed ( identifier );

我想运行where identifier = 'user_5' and post_id = 11;where identifier = 'user_5'; 两种类型的查询

我想为每个查询分页 10 个结果。但是,很少有查询可以具有可变的结果计数。最好有类似 *column* > last_record 的东西我可以使用。

请帮忙。提前致谢。

P.S:Cassandra 版本 - 3.11.6

【问题讨论】:

    标签: cassandra pagination nosql cassandra-3.0


    【解决方案1】:

    首先,也是最重要的 - 您正在接近 Cassandra,就像在单个节点上运行的传统数据库一样。您的数据模型不支持为您的查询有效检索数据,二级索引也无济于事,因为它仍然需要到达所有节点才能获取数据,因为数据将根据值分布在不同节点之间分区键(在您的情况下为(identifier, post_id)) - 它可能适用于小型集群中的小数据,但当您扩大规模时会惨遭失败。

    在 Cassandra 中,所有的数据建模都是从查询开始的,所以如果你通过identifier 查询,那么它应该是一个分区键(尽管如果某些用户会产生大量消息,你可能会遇到大分区的一些问题)。在分区内部,您可以使用二级索引,这应该不是问题。另外,在分区内部更容易组织分页。 Cassandra 原生支持前向分页,所以你只需要保留paging state between queries。在 Java 驱动程序 4.6.0 中,special helper class was added to support paging of results 虽然可能不是很有效,因为它无论如何都需要从 Cassandra 读取数据才能跳到给定的页面,但至少它有一些帮助。以下是文档中的示例:

    String query = "SELECT ...";
    // organize by 20 rows per page
    OffsetPager pager = new OffsetPager(20);
    
    // Get page 2: start from a fresh result set, throw away rows 1-20, then return rows 21-40
    ResultSet rs = session.execute(query);
    OffsetPager.Page<Row> page2 = pager.getPage(rs, 2);
    
    // Get page 5: start from a fresh result set, throw away rows 1-80, then return rows 81-100
    rs = session.execute(query);
    OffsetPager.Page<Row> page5 = pager.getPage(rs, 5);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多