非主要属性的IN运算符

时间:2019-06-12 06:47:14

标签: cassandra cql cqlsh

我可以对Cassandra中的非主键属性使用IN运算符吗?还是其他替代方法,而不是在查询中使用IN?

SELECT * FROM abc WHERE domain IN ('domain1','domain2') allow filtering;

 Error from server: code=2200 [Invalid query] message="IN predicates on non-primary-key columns (domain) is not yet supported"

1 个答案:

答案 0 :(得分:0)

  

您能为我的目的为cassandra中的IN运算符推荐任何替代方法吗?

请记住,仍然可以在分区键上使用IN运算符。它不会说它是 recommended ,但可以使用少量参数就可以了。不过,首先,您必须重新构建表或构建新表以支持该查询。

由于我不知道您的确切表定义,因此我要作一些假设(例如abc_id)。

如果您重新创建与此类似的表:

CREATE TABLE abc_by_domain (
  domain TEXT,
  abc_id TEXT,
  value TEXT,
  PRIMARY KEY (domain,abc_id));

现在向其中写入一些数据,然后可以正常工作:

SELECT * FROM abc_by_domain  WHERE domain IN ('domain1','domain2');

 domain  | abc_id | value
---------+--------+---------
 domain1 |      1 | 1st row
 domain2 |      2 | 2nd row

(2 rows)

注意:

  • 我假定了一个abc_id当前的主键。本质上,我做了一个集群键,以确保现在按域划分的基础行仍然是唯一的。就您而言,请使用abc表中任何可增强唯一性的键列,并将其用作聚类键来完成同一件事。
  • 按照我上面的警告,这被称为“多键查询”,在Cassandra中是一种反模式。问题在于,Cassandra无法保证两个分区上的数据将在同一节点上,因此它实际上选择了一个协调器并在后台运行两个查询。对于两个参数,可能还不错。但我会尽量保持单位位数不变。