Cassandra 如何使查询工作?

Cassandra 如何使查询工作?,cassandra,cassandra-2.0,cql,cql3,Cassandra,Cassandra 2.0,Cql,Cql3,我有卡桑德拉2.0版,在里面我是全新的,所以这个问题。。。 我有一个表T1,列的名称为:1,2,3…14(为了简单起见); 分区键是列1,2; 聚类键是列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

我有卡桑德拉2.0版,在里面我是全新的,所以这个问题。。。 我有一个表
T1
,列的名称为:1,2,3…14(为了简单起见);
分区键
是列
1
2
聚类键
是列
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
子句需要包含分区键的第一个元素。

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

为了确保我理解您的模式,您定义了一个表
T1

CREATE TABLE T1 (
  1 INT,
  2 INT,
  3 INT,
  ...
  14 INT,
  PRIMARY ((1, 2), 3, 1, 5)
);
SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A';
对吗

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

SELECT 1,2,7 FROM T1 where 2 = 'A';
因为您的查询没有为列“1”提供值,没有该值,Cassandra无法计算分区键(根据您的复合
主键
定义,这需要列“1”和“2”),并且没有该值,它无法确定在环中的哪个节点上查找。通过在分区键中包含“2”,您告诉Cassandra该数据是必需的,以确定在何处存储(以及在何处读取)该数据

例如,给定您的模式,此查询应该可以工作:

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

@但是,如果上面的表定义是您工作负载的一大部分,那么Caleb Rockcliffe对于是否需要其他辅助/补充查找机制有很好的建议。您可能需要找到某种方法,首先查找“1”和“2”的值,然后发出查询。例如:

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

SELECT 2 FROM T1_index WHERE 1 = 'X';
然后,对于每个“1”和“2”组合,您可以对表
T1
发出查询:

CREATE TABLE T1 (
  1 INT,
  2 INT,
  3 INT,
  ...
  14 INT,
  PRIMARY ((1, 2), 3, 1, 5)
);
SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A';

希望这有帮助

因此,为了确保我理解您的模式,您定义了一个表
T1

CREATE TABLE T1 (
  1 INT,
  2 INT,
  3 INT,
  ...
  14 INT,
  PRIMARY ((1, 2), 3, 1, 5)
);
SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A';
对吗

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

SELECT 1,2,7 FROM T1 where 2 = 'A';
因为您的查询没有为列“1”提供值,没有该值,Cassandra无法计算分区键(根据您的复合
主键
定义,这需要列“1”和“2”),并且没有该值,它无法确定在环中的哪个节点上查找。通过在分区键中包含“2”,您告诉Cassandra该数据是必需的,以确定在何处存储(以及在何处读取)该数据

例如,给定您的模式,此查询应该可以工作:

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

@但是,如果上面的表定义是您工作负载的一大部分,那么Caleb Rockcliffe对于是否需要其他辅助/补充查找机制有很好的建议。您可能需要找到某种方法,首先查找“1”和“2”的值,然后发出查询。例如:

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

SELECT 2 FROM T1_index WHERE 1 = 'X';
然后,对于每个“1”和“2”组合,您可以对表
T1
发出查询:

CREATE TABLE T1 (
  1 INT,
  2 INT,
  3 INT,
  ...
  14 INT,
  PRIMARY ((1, 2), 3, 1, 5)
);
SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A';

希望这有帮助

是的,这正是错误所说的。但是如何正确地获取我需要的信息呢?如果你没有任何数据建模灵活性,并且你需要跨越分区,那么你可能需要考虑一个索引策略。在vanilla Cassandra 2.0中,这可能意味着使用二级索引,但需要注意一些潜在的性能缺陷。如果这个查询是读取工作量的很大一部分,那么您可能需要考虑对数据进行建模,以使您所限制的键是主键的前缀。但是如何正确地获取我需要的信息呢?如果你没有任何数据建模灵活性,并且你需要跨越分区,那么你可能需要考虑一个索引策略。在vanilla Cassandra 2.0中,这可能意味着使用二级索引,但需要注意一些潜在的性能缺陷。如果这个查询是读取工作量的很大一部分,那么您可能需要考虑对数据进行建模,以便您所限制的键是主键的前缀。这有很大帮助,谢谢。那么这是否意味着对于T1_索引,每次插入T1时都需要单独插入?是的,很遗憾。卡桑德拉喜欢“非规范化”,这实际上意味着复制。而且它不支持外键约束或类似的东西,因此您的应用程序代码需要知道如何写入(多个)相关表并从中读取。我只是花了一些时间在我的模式中尝试了这一点和那一点,似乎我找到了一个基于您所展示内容的任务解决方案。所以我们可以说,对于每个特定的select查询,我需要创建一个单独的表,并在代码中插入批处理时包含该表,只要这些插入可以忽略,就可以了,对吗?所以Cassandra适合大量阅读和偶尔插入或更新,对吗?再说一次,我是it新手,完全是RDBMS高手)Cassandra内部是否有任何机制来保持所有表的更新,而不是在我的代码中插入多个表?实际上,Cassandra针对写操作进行了优化;阅读是昂贵的。这就是为什么非规范化/复制是有用的;它有助于改善Cassandra读取延迟。不,据我所知,Cassandra中没有内置任何东西可以根据一次写入/插入自动更新“相关”表。卡桑德拉的速度和伸缩能力很大一部分来自于没有那种模式关系