java - 如何在 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
;
解决方案
这是 Cassandra 的正确行为,因为您的查询仅受creation_ts
集群列的条件限制。而且由于您对字段没有限制id
,Cassandra 不知道分区键,并且要满足条件,它需要遍历所有数据并应用过滤器。默认情况下,Cassandra 不允许这样的行为没有ALLOW FILTERING
- 就像你在“正常”表上有这样的条件一样。
如果要在系统中执行此类查询,则需要更改方法:
- 更改数据模型,因此数据将按日期/部分时间戳进行分区,然后您需要发出多个查询以覆盖所有必要的时间范围
- 使用将对所有数据执行正确扫描的 Spark 或自定义代码。但这不会很快,因为您需要处理大量数据。
推荐阅读
- node.js - (没有接受的答案)如何使用 ffmpeg 或 opencv 将 2 个重叠视频合并为一个视频?
- azure-active-directory - 我可以关闭 Azure AD RedirectURI 的区分大小写吗
- javascript - 如果我的 var 未设置为 redux 状态,请导航
- salesforce - 如何在 SOQL 上处理大于 2000 的偏移量,而不使用 Salesforce Rest API 按 ID 或日期排序
- kotlin - 使用可为空的值实现类型安全的类层次结构
- c# - 仅在 Android 上的第一个屏幕触摸上使用 EventSystem.Update() 即可实现巨大的性能峰值
- javascript - 无法在初始化时使用 angular2-tree 选择树中的所有复选框
- vbscript - 从文本值中提取最后一个关闭期间
- c - 如何在 CLion 中添加链接器标志
- c# - 运行 TypeScript 文件并在 .NET Core 中获取结果