【问题标题】:How to scan properly a cassandra table page by page for ranged primary key?如何逐页正确扫描 cassandra 表以查找范围主键?
【发布时间】:2022-09-23 03:01:34
【问题描述】:

如果我在 Cassandra 3.11 中有这样的表,如何扫描表:

CREATE TABLE versions (
    root text,
    subroot text,
    key text,
    ts timeuuid,
    size bigint,
    PRIMARY KEY ((root, subroot, key), ts)
) WITH CLUSTERING ORDER BY (ts DESC)

如何仅针对 root=\'a\'、subroot=\'b\'、key>=\'c000000\' 和 key<\'c000001\' 每 1000 次正确扫描(我需要扫描以 @ 开头的所有内容987654322@,例如c000000-aaaaaac000000something等)

因为如果我使用 sum 执行此操作,它会超时

SELECT sum(size) 
FROM versions 
WHERE root=\'a\' 
  AND subroot=\'b\' 
  AND key>=\'c00000\' AND key<\'c000001\' 
ALLOW FILTERING;

有没有办法在没有ALLOW FILTERING 的情况下获取所有内容(我可以使用 golang 代码或其他语言求和)?

    标签: cassandra


    【解决方案1】:

    是的,您仍然需要使用这种分区进行全表扫描。因为您将 key 列作为分区键的一部分,所以值的哈希值可以分布到不同的节点并属于不同的令牌范围。仅使用 CQL 无法有效地做到这一点,因此您需要编写自己的代码或使用 DSBulk 之类的工具(我记得,您也可以使用 DSBulk 作为 Java 库)或 Spark + Spark Cassandra Connector - 两者这些工具针对高效的全表扫描进行了大量优化。

    如果您想自己实现它,您需要编写一个代码来执行以下操作:

    • 拉取令牌范围列表
    • 创建一个包含条件 + 子查询 token(root, subroot, key) &gt; + rangeStart AND token(root, subroot, key) &lt;= rangeEnd 的 CQL 查询
    • 将该查询发送到拥有特定令牌范围的节点之一(我不知道 Go 驱动程序中是否存在此功能)

    请注意,您需要正确处理范围 - 它们不是从 RANGE_MIN 开始的,某些范围可能包括 RANGE_MIN

    您可以查看this Java example - 它使用与 Spark Cassandra 连接器和 DSBulk 相同的算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2010-12-07
      • 2018-11-06
      相关资源
      最近更新 更多