首页 > 解决方案 > 如何在 cassandra 的实体化视图表中使用 less <= 和 >=

问题描述

我的 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

标签: javadatabasespring-bootcassandracql

解决方案


这是 Cassandra 的正确行为,因为您的查询仅受creation_ts集群列的条件限制。而且由于您对字段没有限制id,Cassandra 不知道分区键,并且要满足条件,它需要遍历所有数据并应用过滤器。默认情况下,Cassandra 不允许这样的行为没有ALLOW FILTERING- 就像你在“正常”表上有这样的条件一样。

如果要在系统中执行此类查询,则需要更改方法:

  • 更改数据模型,因此数据将按日期/部分时间戳进行分区,然后您需要发出多个查询以覆盖所有必要的时间范围
  • 使用将对所有数据执行正确扫描的 Spark 或自定义代码。但这不会很快,因为您需要处理大量数据。

推荐阅读