【问题标题】:Cassandra where clause combine SLICE and IN restrictions on clustering keysCassandra where 子句结合了 SLICE 和 IN 对集群键的限制
【发布时间】:2018-01-19 22:55:30
【问题描述】:

我想使用聚类键上的过滤器来选择数据。

特别是我需要两个聚类键上的过滤器:

  • 应使用切片过滤器限制第一个聚类键(如 >、>=、
  • 应使用 IN 过滤器限制第二个聚类键

使用最新版本的 cassandra (3.11.0) 这样的过滤器不起作用。 顺便说一句:在文档中没有发现这个特殊的限制。

以下是重现问题的步骤:

DROP TABLE IF EXISTS testing.t1

CREATE TABLE IF NOT EXISTS testing.t1 (
c1 text,
c2 int,
c3 text,
PRIMARY KEY (c1, c2, c3));

INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key1',100,'clust1')
INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key1',110,'clust1')
INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key1',120,'clust2')
INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key1',130,'clust3')
INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key2',160,'clust2')

SELECT * FROM testing.t1
WHERE c1 = 'key1'
AND c2 > 100
AND c3 IN ('clust2','clust3')
ALLOW FILTERING

查询产生以下错误:

code=2200 [无效查询] message="索引列不支持IN限制"

你能帮我澄清一下这个问题吗?

是否有特殊原因不允许使用此类过滤器,或者它是过去的遗留物?

谢谢!

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    这是documentation的摘录:

    IN关键字可以定义一组聚类列来获取 一起,支持 CQL 行的“多获取”。单个聚类 如果所有前面的列都定义为任一列,则可以定义列 平等或群体包容。

    基本上,当所有先前的聚类列都用相等或IN 子句指定时,您只能使用IN 子句。

    但是,您可以在使用 IN 子句后使用切片过滤器,只要它用于聚类键的最后一个元素。

    此限制也在本博客post>、>=、 部分中进行了描述(不过它讨论的是2.2 版)。

    【讨论】:

    • 感谢您指出文档。至于允许 IN 过滤器的情况。您不仅可以在最后一个位置使用切片过滤器进行过滤。以下查询完美运行:CREATE TABLE IF NOT EXISTS testing.t1 ( c1 text, c2 int, c3 int, c4 int, PRIMARY KEY (c1, c2, c3, c4)); SELECT * FROM testing.t1 WHERE c1 = 'key1' AND c2 IN (100,110,120,160) AND c3 > 1 AND c4 = 5000 ALLOW FILTERING
    • 我想知道这是3.x版本的变化还是我一开始感到困惑。
    猜你喜欢
    • 2013-08-16
    • 2020-08-18
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2020-10-19
    相关资源
    最近更新 更多