Cassandra分页和令牌功能;选择分区键

时间:2018-03-02 19:01:42

标签: cassandra cql cassandra-3.0 cqlsh

我最近在Cassandra数据建模和最佳实践方面做了很多阅读。

如果我希望应用程序通过令牌功能翻译结果,那么选择分区键的最佳做法是逃避我的。

我目前的问题是我希望在我的应用程序中每页显示100个结果,然后能够继续下一个100个结果。

从这篇文章:https://stackoverflow.com/a/24953331/1224608 我认为应该选择分区键,以便数据在每个节点上均匀分布。也就是说,分区键不一定是唯一的。

但是,如果我使用令牌功能翻阅结果,例如:

SELECT * FROM table WHERE token(partitionKey) > token('someKey') LIMIT 100;

这意味着从我的分区返回的结果数量可能不一定与我在页面上显示的结果数量相匹配,因为多行可能具有相同的令牌(partitionKey)值。或者更糟糕的是,如果共享分区键的行数超过100,我将错过结果。

我能在每个页面上保证100个结果的唯一方法(除了最后一页)是我是否要使分区键唯一。然后,我可以读取页面中的最后一个值,并使用几乎相同的查询检索下一个查询:

SELECT * FROM table WHERE token(partitionKey) > token('lastKeyOfCurrentPage') LIMIT 100;

但我不确定为复杂表格提供唯一的分区键是否是一种好习惯。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

  
    

但我不确定为复杂表格提供唯一的分区键是否是一种好习惯。

  

取决于要求和数据模型,您应该如何选择分区键。如果您有一个密钥作为分区密钥,则它必须是唯一的,否则数据将被upsert(用新数据覆盖)。如果您有宽行(聚类键),那么使您的分区键唯一(在表中出现一次的键)将不会用于宽行。在CQL中,“宽行”只意味着每个分区可以有多个行。但是这里每个分区会有一行。如果你能提供架构会更好。

请按照以下链接了解Cassandra的分页。

  

如果您使用的是Cassandra 2.0+,则无需使用令牌。   Cassandra 2.0具有自动分页功能。而不是使用令牌功能   创建分页,它现在是一个内置功能。<​​/ p>

Results pagination in Cassandra (CQL)

https://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0 https://docs.datastax.com/en/developer/java-driver/2.1/manual/paging/

  

保存并重复使用分页状态

您可以使用pagingState对象来表示在获取最后一页时您在结果集中的位置。

已编辑

请查看以下链接:

Paging Resultsets in Cassandra with compound primary keys - Missing out on rows

答案 1 :(得分:0)

我最近针对类似问题做了POC。也许可以在这里快速添加。

首先,有一个包含两个字段的表。仅出于说明目的,我们仅使用几个字段。

1。假设我们以此插入一百万行

产品所有者还提出了一个(非常奇怪的)要求,即我们需要将所有数据作为GUI中的页面列出。假设有100个条目,每个条目10页。

  1. 为此,我们使用称为page_no的列更新表。
  2. 为此列创建二级索引。
  3. 然后使用页码对此列进行一次更新。页码10表示10个连续的行,它们以page_no作为值10更新。
  4. 因为我们可以查询二级索引,所以每个页面都可以独立查询。

代码不言自明,这里-https://github.com/alexcpn/testgo

关于如何正确使用二级索引的注意事项很多。请检查一下。在这种用例中,我希望我能正确使用它。尚未针对多个群集进行测试。

  

”在实践中,这意味着索引对于返回十进制最为有用,   也许有数百个结果。下次考虑时请记住这一点   使用辅助索引。”来自http://www.wentnet.com/blog/?p=77