在查询选择集合时,无法通过关系限制聚类列

时间:2017-04-24 05:20:09

标签: cassandra

我正在阅读这篇文章,该文章展示了如何使用cassandra

中的IN子句编写查询

https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

我创建了下表

create table foo2(id bigint, bid bigint, data set<bigint>, primary key (id, bid));

insert into foo2 (id, bid, data) values (1, 1, {1, 2});
insert into foo2 (id, bid, data) values (1, 2, {3, 4});
insert into foo2 (id, bid, data) values (1, 3, {5, 6});

现在我写了查询

select * from foo2 where id = 1 and bid IN (1, 2, 3);

在查询选择集合时,无法按关系限制群集列。

我搜索了这个错误,发现了这个

https://issues.apache.org/jira/browse/CASSANDRA-12654

它说这个问题在Cassandra 4.0中得到了解决,但我使用了

[cqlsh 5.0.1 | Cassandra 3.10 | CQL spec 3.4.4 | Native protocol v4]

是否有解决方法(除了任何Cassandra问题的所有答案的母亲change your schema

有些人指着这里:Cassandra IN query not working if table has SET type column

但这并不是一个没有明确答案的问题。

2 个答案:

答案 0 :(得分:4)

旧答案:
使用列名称而不是*可以解决问题。 在您的情况下,查询应该是:
select id,bid,data from foo2 where id = 1 and bid IN (1, 2, 3);

<强>更新
我之前的回答是错误的,应该是Cassandra的限制,当我们查询集合列(数据列)时,我们无法使用IN查询群集密钥。如果您确实需要IN查询,则可以更改表的架构:

create table foo3(id bigint, bid bigint, data set<bigint>, primary key ((id, bid)));
(新括号在表格的键中引入)

在这个新架构中,分区键是 id bid 的列组,我们可以在其中查询分区键。现在,下面的查询应该工作:
select * from foo3 where id = 1 and bid IN (1, 2, 3);

答案 1 :(得分:4)

您可能不喜欢这个答案,但您必须稍微更改架构才能解决此问题。使用frozen,问题就会消失。 请注意,此问题也会影响UDT,并且使用frozen也可以解决这个问题。