我的cql查询
CREATE MATERIALIZED VIEW mv_test AS
SELECT * FROM host_accounts WHERE id IS NOT NULL AND creation_ts IS NOT NULL
PRIMARY KEY (id, creation_ts) WITH clustering ORDER BY (creation_ts DESC);
这是我的问题,但它给出了这个错误 InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"
当我使用此查询时 select * from mv_test where creation_ts > 1606761000 AND creation_ts < 1609353000
;
1条答案
按热度按时间lqfhib0f1#
这是cassandra的正确行为,因为您的查询只受
creation_ts
这是聚类列。因为你没有限制id
字段中,cassandra不知道分区键,为了满足条件,它需要遍历所有数据并应用过滤器。默认情况下,Cassandra不允许这种行为ALLOW FILTERING
-就像你在“正常”表上有这样的条件一样。如果要在系统中执行此类查询,则需要更改方法:
更改数据模型,这样数据将按日期/时间戳的一部分进行分区,然后需要发出多个查询来覆盖所有必要的时间范围
使用spark或自定义代码对所有数据执行正确扫描。但这不会很快,因为您需要处理大量数据。