如何在 cassandra 中的材料化视图表中使用更少的 <= 和 >=



我的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或自定义代码来正确扫描所有数据。但这不会很快,因为您需要处理大量数据

最新更新