我的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);
这是我的查询,但当我使用此查询select * from mv_test where creation_ts > 1606761000 AND creation_ts < 1609353000
时,它给出了此错误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"
;
这是Cassandra的正确行为,因为您的查询仅受作为集群列的creation_ts
上的条件限制。由于您对id
字段没有限制,Cassandra不知道分区键,并且要满足条件,它需要遍历所有数据并应用筛选器。默认情况下,Cassandra在没有ALLOW FILTERING
的情况下不允许这样的行为——就像你在";正常的";桌子
如果你想在你的系统中执行这样的查询,你需要改变方法:
- 更改数据模型,因此数据将按日期/时间戳的一部分进行分区,然后您需要发出多个查询以覆盖所有必要的时间范围
- 使用Spark或自定义代码来正确扫描所有数据。但这不会很快,因为您需要处理大量数据