2

使用 CQL3,如何枚举 Cassandra 中表的所有分区键?特别是返回不同的键和对结果进行分页时会很复杂。

4

3 回答 3

5

您可以按照以下示例进行操作。创建测试表:

> 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-08-14T13:22:42.470 回答
4

坏消息是现在(2013 年 8 月)您必须选择整个主键,而不仅仅是分区键,才能对它们进行分页。对于复合 PK,这可能涉及大量重复的分区键。

好消息是https://issues.apache.org/jira/browse/CASSANDRA-4536已开放以允许SELECT DISTINCT2.0.1 中的特殊分区键,因为可以在兜帽; 在那之前,CQL 还没有很好的方式来表达这一点。

于 2013-08-15T15:33:35.563 回答
0

对您的密钥的可能值有一点预先了解,我认为这可以在令牌功能的帮助下完成。看看这个答案。那是你要找的吗?

此外,原生分页似乎是2.0 即将推出的功能。它是最新的 beta 版本

在 2.0 到来之前,您可以在 datastax 博客上看到这种分页解决方法(请参阅“CQL3 分页”部分)。原则上,这与我在上面发布的链接非常相​​似,但非常详细地介绍了如何在考虑列键的情况下实现分页等。

于 2013-08-14T12:33:56.087 回答