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

时间:2016-02-20 14:20:00

标签: indexing cassandra where-clause database nosql

我是cassandra的新手,我将其用于分析任务(需要良好的索引编制)。

我在这篇文章(及其他人)中读到:cassandra, select via a non primary key我无法用WHERE clause的非主键列查询我的数据库。

为此,似乎有3种可能性(ALL具有主要缺点):

  • 创建辅助索引(不建议用于性能问题)。
  • 创建一个新表(即使cassandra没问题,我也不想要冗余数据)。
  • 在主键中放置我想要查询的列,在这种情况下,我需要在WHERE子句中定义主键的所有部分,我不能使用除IN之外的其他运算符或{ {1}}。

在没有上述3个约束的情况下,还有另一种方法可以解决我想要做的事情(=与非主键列)吗?

4 个答案:

答案 0 :(得分:5)

在Cassandra内部,您仅限于上面指定的选项。如果你想知道为什么看看这里:

A Deep Look to the CQL Where Clause

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

答案 1 :(得分:0)

我认为该表是为不同目的而设计的,因为您要查询的字段不是分区键的一部分。我的建议是复制表并按要查询的字段对其进行键入。我建议根据Data modeling concepts设计一个新表,用于确切目的。

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

答案 2 :(得分:0)

我在使用cassandra 2.x版本时遇到类似问题,将您的版本升级到cassandra 3.0及更高版本。这是我唯一的解决方案。

答案 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] . . .] ;

请参阅https://docs.datastax.com/en/archived/cql/3.3/cql/cql_reference/cqlUpdate.html