【问题标题】:Cassandra - WHERE clause with non primary key disadvantagesCassandra - 具有非主键缺点的 WHERE 子句
【发布时间】:2016-06-02 03:50:39
【问题描述】:

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

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

这样做,似乎有 3 种可能性(都有很大的缺点):

  • 创建二级索引(不推荐用于性能问题)。
  • 创建一个新表(我不想要冗余数据,即使 cassandra 没问题)。
  • 将要查询的列放在主键中,在这种情况下,我需要在 WHERE 子句中定义主键的所有部分,并且不能使用除IN= 之外的其他运算符.

在没有上述 3 个约束的情况下,是否有其他方法可以解决我想要做的事情(WHERE clause 带有非主键列)?

【问题讨论】:

  • Cassandra 确实不适合您描述的用例。听起来您需要查询灵活性,而您根本无法从 Cassandra 中获得这种灵活性。最重要的是,建议创建查询表(带有冗余数据)是一种可扩展的解决方案;而尝试像关系数据库一样使用 Cassandra 则不然。
  • 嗨@Aaron oups,问题是对于查询灵活性mongodbcassandra 更推荐,但对于read/write 性能(这在我的情况下非常重要),后者非常在这一点上很糟糕。
  • 而您将看到这种性能的唯一方法是采用使用冗余数据的基于查询的建模方法。当您尝试使用关系模型或类似方法来实现查询灵活性时,Cassandra 的表现非常糟糕。
  • OK :) 有没有关于如何构建查询表的好文档?
  • 我建议从 datastax 中观看有关数据建模的课程,这与核心概念课程一起提供了非常坚实的基础:academy.datastax.com/courses/ds220-data-modeling

标签: indexing cassandra where-clause database nosql


【解决方案1】:

在 Cassandra 内部,您只能使用上面指定的选项。如果你想知道为什么看这里:

A Deep Look to the CQL Where Clause

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

【讨论】:

  • 嗨@bechbd 谢谢你的回应。我在这里遇到了索引问题,如果没有我上面提到的约束,spark 如何能够加载数据?
  • 您必须使用上面链接中的限制将数据加载到 Spark RDD 中。一旦进入 Spark,您就可以使用过滤器、map/reduce、range 将大量数据过滤到您要查找的内容中。对您的索引问题的简短回答是,您尝试做的事情违反了 Cassandra 架构的基本方式之一。 AFAIK 在 Cassandra 2.X 中无法绕过这些限制如果您使用的是 Cassandra 3.X,您可以查看使用物化视图,但是这些会引入它们自己的复杂性。
【解决方案2】:

请尝试在您的查询中使用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

【讨论】:

  • IF 与问题作者的要求没有任何关系...
  • 这可以工作,在 where 子句中提供所有必需的主键,对于任何非主列,您可以在:IF 条件子句中提供它。注意:您的 Cassandra 表定义应该能够使用 where 子句中的主键组合指定唯一行。如果您需要在 where 子句中提供非主列,则应重新考虑整个表定义,因为在 Cassandra 中,表必须根据查询要求进行描述
【解决方案3】:

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

Cassandra 通过对您可以使用 CQL 执行的操作施加某些限制来提供线性缩放等多项优势。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 2019-01-22
      • 2014-12-12
      • 2017-09-08
      • 2015-09-13
      • 2017-01-04
      • 2018-09-19
      • 1970-01-01
      相关资源
      最近更新 更多