如何使查询工作?

How to make the query to work?

我有 Cassandra 2.0 版,我对它是全新的,所以问题... 我有 table T1,列的名称为:1,2,3...14(为简单起见); Partitioning key 是列 1 , 2; Clustering key 是列 315; 我需要执行以下查询:

SELECT 1,2,7 FROM T1 where 2='A';

2 是一个标志,因此值是重复的。 我收到以下错误:

Unable to execute CQL query: Partitioning column 2 cannot be restricted because the preceding column 1 is either not restricted or is restricted by a non-EQ relation

那么正确的做法是什么?我真的需要获取已经过滤的数据。谢谢。

您的 WHERE 子句需要包含分区键的第一个元素。

所以,为了确保我理解你的架构,你定义了一个 table T1:

CREATE TABLE T1 (
  1 INT,
  2 INT,
  3 INT,
  ...
  14 INT,
  PRIMARY ((1, 2), 3, 1, 5)
);

正确吗?

如果是这种情况,那么 Cassandra 无法 找到数据来回答您的 CQL 查询:

SELECT 1,2,7 FROM T1 where 2 = 'A';

因为您的查询没有为列“1”提供值,否则 Cassandra 无法计算分区键(根据您的复合 PRIMARY KEY 定义,这需要两列“1”and "2"),没有它,它无法确定在环中的哪些节点上查找。通过在您的 分区键 中包含“2”,您是在告诉 Cassandra 需要 该数据以确定存储位置(因此, 读取)那个数据。

例如,给定您的架构,此查询应该有效:

SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A';

因为您提供了分区键的两个值。

@Caleb Rockcliffe 有很好的建议,但是,如果上述 table 定义是您工作量的很大一部分,则需要其他 secondary/supplemental 查找机制。您可能需要找到某种方法来首先 查找“1”和“2”的值,然后 发出您的查询。 例如

CREATE TABLE T1_index (
  1 INT,
  2 INT,
  PRIMARY KEY (1, 2);
);

给定“1”的值,以上将提供 所有 个可能的“2”值,然后您可以通过这些值进行迭代:

SELECT 2 FROM T1_index WHERE 1 = 'X';

然后,对于每个“1”和“2”组合,您可以然后针对table发出查询T1:

SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A';

希望对您有所帮助!