如何逐页正确扫描Cassandra表中的范围主键?

zzlelutf  于 2022-09-27  发布在  Cassandra
关注(0)|答案(1)|浏览(135)

如果在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'、superlot='b'、key>='c000000'和key<'c000001'(我需要扫描以c000000*开头的所有内容,例如e1d1e、c000000something等)每1000进行正确扫描
因为如果我用sum做这个,就会超时

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

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

wtzytmuj

wtzytmuj1#

是的,您仍然需要对这种分区进行全表扫描。因为key列是分区键的一部分,所以值的哈希可以分布到不同的节点,并且属于不同的令牌范围。您不能仅使用CQL有效地实现这一点,因此您需要编写自己的代码或使用DSBulk(我记得,您也可以将DSBulk用作Java库)或Spark+Spark Cassandra Connector之类的工具-这两个工具都经过了高度优化,以实现高效的全表扫描。
如果您想自己实现它,您需要编写一个代码,它将执行以下操作:

  • 拉取令牌范围列表
  • 创建包含条件+子查询e1d1e的CQL查询
  • 将该查询发送到拥有特定令牌范围的节点之一(我不知道Go驱动程序中是否存在此功能)

请注意,您需要正确处理范围-它们不是从RANGE_MIN开始的,一些范围可能包括RANGE_MIN
您可以查看this Java example,它使用与Spark Cassandra Connector和DSBulk相同的算法。

相关问题