【问题标题】:Cassandra Filter Two ColumnsCassandra 过滤两列
【发布时间】:2019-06-29 19:44:52
【问题描述】:

有没有办法过滤大于一列而小于另一列,或者适当地建模?

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="无法限制聚类列“高”(前面的列“低”受非 EQ 关系限制)”

我目前已启用过滤。它在一个分区上,并且对远远超出预期场景的场景的跟踪在可接受的范围内执行,但我想知道是否有更好的方法来对表进行建模,以便所有人获取信息而不导致过滤?

【问题讨论】:

  • 这是它为什么不起作用的解释 - Clustering columns。如果可能的话,一个可能的解决方案是使用 IN 作为低列
  • 谢谢。好吧,老实说,低值可以是任何数字,所以我认为 IN 行不通。

标签: cassandra cql


【解决方案1】:

在我看来,您唯一可以做的就是在物化视图中为 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

在应用程序中,您必须在低值和高值之间进行交集。

另外,请记住,您可以对聚类列进行排序,从而对低位和高位数字进行排序。

【讨论】:

  • 我只是想知道,为什么不允许过滤不存在​​?你能告诉我我哪里想错了吗?
  • 在声明 PRIMARY KEY 时,您声明的第一列是分区键,其余列是集群键。为了进行查询,您需要在 WHERE 子句中包含所有分区键,并且在添加集群键的情况下,它们必须按顺序排列。如果没有,您必须使用(不推荐)ALLOW FILTERING。
猜你喜欢
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2021-05-05
  • 2021-03-31
  • 2013-01-23
相关资源
最近更新 更多