cassandra - Cassandra 过滤两列
问题描述
有没有办法过滤大于一列而小于另一列,或者适当地建模?
create table foo (id int, low int, high int, primary key (id, low, high));
这些查询有效:
select * from foo;
select * from foo where id = 1 and low < 0;
但是这个查询没有:
select * from foo where id = 1 and low < 0 and high >10;
并导致:
InvalidRequest:来自服务器的错误:code=2200 [Invalid query] message="无法限制聚类列“high”(前面的列“low”受非 EQ 关系限制)”
我目前采用允许过滤。它在一个分区上,并且对远远超出预期场景的场景的跟踪在可接受的范围内执行,但我想知道是否有更好的方法来对表进行建模以获取所有信息而不导致过滤?
解决方案
在我看来,您唯一可以做的就是在物化视图中对high
值进行过滤,如下所示:
CREATE MATERIALIZED VIEW IF NOT EXISTS foo_high_first
AS SELECT id, low, high FROM foo
WHERE id IS NOT NULL AND low IS NOT NULL AND high IS NOT NULL
PRIMARY KEY (id, high, low);
然后您可以执行以下查询:
cqlsh:my_keyspace> select * from foo_high_first where id = 1 and high > 3;
id | high | low
----+------+-----
1 | 6 | 1
在应用程序中,您必须在低值和高值之间进行交集。
另外,请记住,您可以对聚类列进行排序,从而对低数字和高数字进行排序。
推荐阅读
- latex - 如何在尾注中指定字体?
- c - 这个写入管道的程序能否针对性能进行优化?
- mysql - MySQL中非常简单的查询
- eclipse - Eclipse 调试仅使用 SpringBootTest webEnvironment 忽略断点
- javascript - 如何修复以下 html 中的 Javascript?
- javascript - 如何从网站上的 jplot 图中获取数据
- c++ - 偏移量和步幅
- php - 如何用 php 执行 .sh 文件
- python - 如何使用 Robot Framework 处理 Appium 中的 DatePicker?
- go - 将 `decimal.NullDecimal` 类型转换为 int