【问题标题】:Using CQL to walk partition keys of a Cassandra table使用 CQL 遍历 Cassandra 表的分区键
【发布时间】:2013-08-16 08:32:52
【问题描述】:

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

【问题讨论】:

  • 查看 Richard 的 this blogpost,它非常详细地说明了为什么在分布式系统中很难计算密钥。
  • @LyubenTodorov:我知道这些困难。但是我只关注键,我不在乎计数或一致性。

标签: sql cassandra partitioning cql cql3


【解决方案1】:

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

另外,原生分页似乎是an upcoming feature for 2.0。我是in the latest beta

在 2.0 到来之前,您可以在 datastax 博客上看到这个work-around for pagination(转到“CQL3 分页”部分)。原则上,这与我在上面发布的链接非常相​​似,但详细介绍了如何在考虑列键等情况下实现分页。

【讨论】:

  • 链接的答案不允许为此目的分页。
  • 我更新了我的答案,链接了一个更详细的示例,如何使用我之前链接的令牌和限制查询。
  • 关于在DataStax Docs页面中使用TOKEN函数here进行分页。
【解决方案2】:

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

> 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 仍然非常繁重。

此外,如果行被创建或删除并且具有比您目前为止更高的标记,它们将出现在后续查询中。因此,如果您在创建或删除行时运行上述分页查询,则可能会或可能不会返回分区键,具体取决于时间。

【讨论】:

  • 您可以使用什么作为起始标记,而不必有 2 个不同的查询字符串?您的查询将如何处理每个主键的多行?例如,假设主键中有 2 个字段,p_key 是分区键。现在可以有多行具有相同的 p_key。
  • token('') 返回最小值,因此您可以将第一个查询替换为 select p_key from partition_keys_test where token(p_key) > token('') limit 2;。如果您有一个复合主键,那么您将获得重复项。我认为没有任何方法可以过滤掉服务器端的重复项。
  • 正确,但这不适用于复合PK的一般情况;请参阅下面的答案。
  • 这个方法除了手动过滤重复的烦人之外,为什么不能获取所有的分区键?
【解决方案3】:

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

好消息是https://issues.apache.org/jira/browse/CASSANDRA-4536 是开放的,允许SELECT DISTINCT 用于 2.0.1 中分区键的特殊情况,因为可以在后台有效地检索唯一的分区键;在那之前,CQL 还没有很好的表达方式。

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 2017-03-13
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多