如何使查询工作?
How to make the query to work?
我有 Cassandra 2.0 版,我对它是全新的,所以问题...
我有 table T1
,列的名称为:1,2,3...14(为简单起见);
Partitioning key
是列 1
, 2
;
Clustering key
是列 3
、1
、5
;
我需要执行以下查询:
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';
希望对您有所帮助!
我有 Cassandra 2.0 版,我对它是全新的,所以问题...
我有 table T1
,列的名称为:1,2,3...14(为简单起见);
Partitioning key
是列 1
, 2
;
Clustering key
是列 3
、1
、5
;
我需要执行以下查询:
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';
希望对您有所帮助!