如果在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代码或其他语言求和)?
1条答案
按热度按时间wtzytmuj1#
是的,您仍然需要对这种分区进行全表扫描。因为
key
列是分区键的一部分,所以值的哈希可以分布到不同的节点,并且属于不同的令牌范围。您不能仅使用CQL有效地实现这一点,因此您需要编写自己的代码或使用DSBulk(我记得,您也可以将DSBulk用作Java库)或Spark+Spark Cassandra Connector之类的工具-这两个工具都经过了高度优化,以实现高效的全表扫描。如果您想自己实现它,您需要编写一个代码,它将执行以下操作:
请注意,您需要正确处理范围-它们不是从
RANGE_MIN
开始的,一些范围可能包括RANGE_MIN
。您可以查看this Java example,它使用与Spark Cassandra Connector和DSBulk相同的算法。