Indexing Cassandra-WHERE子句具有非主键缺点

Indexing Cassandra-WHERE子句具有非主键缺点,indexing,cassandra,where-clause,database,nosql,Indexing,Cassandra,Where Clause,Database,Nosql,我是新来的cassandra,我正在使用它进行分析任务(需要良好的索引) 我在这篇文章(和其他文章)中读到:我不能用WHERE子句查询非主键列的数据库 要做到这一点,似乎有3种可能性(都有主要缺点): 创建辅助索引(不建议用于性能问题) 创建一个新表(即使cassandra可以,我也不需要冗余数据) 将我要查询的列放在主键中,在这种情况下,我需要在WHERE子句中定义主键的所有部分,并且我不能在或=中使用其他运算符 在没有上述3个约束条件的情况下,是否有其他方法可以实现我的目标(WHERE子

我是新来的
cassandra
,我正在使用它进行分析任务(需要良好的索引)

我在这篇文章(和其他文章)中读到:我不能用
WHERE子句
查询非主键列的数据库

要做到这一点,似乎有3种可能性(都有主要缺点):

  • 创建辅助索引(不建议用于性能问题)
  • 创建一个新表(即使cassandra可以,我也不需要冗余数据)
  • 将我要查询的列放在主键中,在这种情况下,我需要在WHERE子句中定义主键的所有部分,并且我不能在或=中使用其他运算符

在没有上述3个约束条件的情况下,是否有其他方法可以实现我的目标(
WHERE子句
带有非主键列)?

从Cassandra本身来看,您仅限于上面指定的选项。如果您想知道为什么要看这里:


但是,如果您试图对存储在Cassandra中的信息进行分析,那么您是否考虑过使用Spark。Spark是为分布式系统上的大规模数据处理而构建的。事实上,如果您正在考虑使用Datastax(请参阅),它在Spark和Cassandra之间有一些很好的集成特性,专门用于加载和保存数据。它有免费版(社区版)和付费版(企业版)

我假设该表是为不同的目的设计的,因为您要查询的字段不是分区键的一部分。我的建议是复制该表,并按要查询它的字段对其进行键控。我建议您设计一个新的表,以达到您将根据使用它的确切目的


Cassandra提供了一些优势,例如线性缩放等,通过对CQL的操作施加某些限制。

我在使用Cassandra 2.x版本时遇到了类似问题,请将您的版本升级到Cassandra 3.0及以上版本。这是我唯一的解决办法

请尝试在查询中使用
IF

UPDATE [keyspace_name.] table_name
[USING TTL time_value | USING TIMESTAMP timestamp_value]
SET assignment [, assignment] . . . 
WHERE row_specification
[IF EXISTS | IF condition [AND condition] . . .] ;

请参见

Hi@bechbd谢谢您的回复。我这里有一个索引问题,spark如何能够在没有我提到的abov约束的情况下加载数据?您必须使用我上面链接中的限制将数据加载到spark RDD中。一旦进入Spark,您就可以使用filters、map/reduce、range将大量数据过滤到您要查找的内容中。对索引问题的简短回答是,您试图做的事情违反了Cassandra架构的基本方式之一。如果您使用Cassandra 3.X,那么Cassandra 2.X中没有任何方法可以绕过这些限制,您可以使用物化视图,但是这些视图会引入自身的复杂性。Cassandra确实不适合您所描述的用例。听起来您需要查询灵活性,而您根本无法从Cassandra中获得这一点。底线是,建议创建查询表(使用冗余数据)是一个可伸缩的解决方案;然而,试图像关系数据库一样使用Cassandra并非如此。Hi@Aaron oups,问题在于,对于查询灵活性而言,建议使用
mongodb
而不是
Cassandra
,但对于
读/写
性能而言,这一点非常重要在这一点上,后者是非常糟糕的。而您将看到这种性能的唯一方法是使用冗余数据采用基于查询的建模方法。当您试图使用关系模型或类似方法来实现查询灵活性时,Cassandra的表现非常糟糕。好的:)关于如何构建查询表,有没有好的文档?我建议您从datastax上观看这门关于数据建模的课程,这与核心概念课程一起提供了一个相当坚实的基础:
如果
与问题作者的要求没有任何关系……这可以工作,在where子句中提供所有必需的主键,对于任何非主键列,可以在:IF条件子句中提供。注意:您的Cassandra表定义应该能够使用where子句中的主键组合指定唯一的行。如果需要在where子句中提供非主列,那么应该重新考虑整个表定义,因为在Cassandra中,表必须按照查询要求进行描述