使用 CQL3,如何枚举 Cassandra 中表的所有分区键?特别是返回不同的键和对结果进行分页时会很复杂。
3 回答
您可以按照以下示例进行操作。创建测试表:
> create table partition_keys_test (p_key text PRIMARY KEY, rest text);
并插入一些行,例如:
> insert into partition_keys_test (p_key, rest) VALUES ('1', 'blah');
我为 p_key '1', '2', ..., '9' 做了这个。
然后翻阅分区键。从...开始:
> select p_key from partition_keys_test limit 2;
p_key
-------
6
7
对于页面大小 2。然后,获取最后一个 p_key 结果并在下一个查询中使用它:
> select p_key from partition_keys_test where token(p_key) > token('7') limit 2;
p_key
-------
9
4
依此类推,直到您收到小于您的页面大小的结果。
请注意,您应该期望这会通读您的整个数据集。对于非常宽的行,它可能不会,但 I/O 仍然非常繁重。
此外,如果行被创建或删除并且具有比您到目前为止更高的标记,它们将出现在后续查询中。因此,如果您在创建或删除行时运行上述分页查询,则可能会或可能不会返回分区键,具体取决于时间。
坏消息是现在(2013 年 8 月)您必须选择整个主键,而不仅仅是分区键,才能对它们进行分页。对于复合 PK,这可能涉及大量重复的分区键。
好消息是https://issues.apache.org/jira/browse/CASSANDRA-4536已开放以允许SELECT DISTINCT
2.0.1 中的特殊分区键,因为可以在兜帽; 在那之前,CQL 还没有很好的方式来表达这一点。
对您的密钥的可能值有一点预先了解,我认为这可以在令牌功能的帮助下完成。看看这个答案。那是你要找的吗?
此外,原生分页似乎是2.0 即将推出的功能。它是最新的 beta 版本。
在 2.0 到来之前,您可以在 datastax 博客上看到这种分页解决方法(请参阅“CQL3 分页”部分)。原则上,这与我在上面发布的链接非常相似,但非常详细地介绍了如何在考虑列键的情况下实现分页等。