使用CQL3,如何枚举Cassandra中表的所有分区键?特别是返回不同的键并对结果进行分页会有复杂性。
答案 0 :(得分:4)
您可以按照以下示例执行此操作。创建一个测试表:
> 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重。
此外,如果创建或删除行并且令牌高于您到目前为止的行数,则它们将出现在后续查询中。因此,如果您在创建或删除行时运行上述分页查询,则可能会也可能不会返回分区键,具体取决于时间。
答案 1 :(得分:4)
坏消息是,就目前(2013年8月)而言,您必须选择整个主键,而不仅仅是分区键,以便通过它们进行分页。使用复合PK,这可能涉及许多重复的分区键。
好消息是https://issues.apache.org/jira/browse/CASSANDRA-4536对于2.0.1中的分区键的特殊情况允许SELECT DISTINCT
是开放的,因为它可以在引擎盖下有效地检索唯一的分区键;在那之前,CQL没有很好的表达方式。
答案 2 :(得分:0)
通过对密钥可能值的一些预先了解,我认为这可以在令牌功能的帮助下完成。看看this answer。那是你在找什么?
此外,原生分页似乎是an upcoming feature for 2.0。这是in the latest beta。
在2.0到达之前,你可以在datastax博客上看到这个work-around for pagination(进入“CQL3分页”部分)。原则上,这与我上面发布的链接大致相同,但详细介绍了如何实现分页考虑列密钥等。