【问题标题】:Cassandra data model with multiple conditions具有多个条件的 Cassandra 数据模型
【发布时间】:2017-05-14 13:52:02
【问题描述】:

我是 Cassandra 的新手,所以我阅读了十几篇关于它的文章,因此我了解了基础知识。所有教程都通过 1 或 2 列和时间范围展示了高效的数据检索。如果您有更多条件,我找不到的是如何正确建模您的数据。

我有一个大型事件规范化数据库,有很多列,比如:

  • 事件类型
  • 时间
  • 电子邮件
  • 用户年龄
  • user_country
  • 用户语言
  • 等等。

我需要能够按所有列进行查询。所以在 RDBMS 中我会查询:

SELECT email FROM table WHERE time > X AND user_age BETWEEN X AND X AND user_language = 'nl' 等..

我知道我可以为每一列制作一个单独的表格,但我仍然需要合并结果。也许这不是一个坏方法,但我对此表示怀疑,因为没有子查询。

我的问题显然是,如何在 Cassandra 中正确建模这种数据?

非常感谢!

【问题讨论】:

  • 所以一个潜在的解决方案是:为每个事件类型创建单独的表。我们有一个“merchant_id”列,我们可以将其用作分区键,我们总是查找一个时间范围和 Merchant_id,所以在一个分区上。我们可以将其余的添加为二级索引吗? eventtype 表 + Mercer_id + time selection 中可能仍有数百万行。

标签: cassandra data-modeling cassandra-2.0 cql3 nosql


【解决方案1】:

我需要能够按所有列查询。

让我阻止你。在 Cassandra 中,您可以根据预期的查询模式创建表,并且通常一个表支持单个查询。在您的情况下,您有“相当多”列,您需要将该数据复制到旨在支持每个可能查询的表中。这将很快变得庞大而笨拙。

我们可以将其余部分添加为二级索引吗? eventtype 表 + Mercer_id + time selection 中可能仍有数百万行。

二级索引旨在用于中间的基数列。因此,极低和极高的基数列都对二级索引不利。问题在于,Cassandra 必须选择一个节点作为协调器,扫描每个节点上的索引(导致大量网络时间),然后构建并返回结果集。这是性能不佳的处方,与使用分布式数据库的最佳实践背道而驰。

简而言之,对于这样的用例,Cassandra 并不是一个好的解决方案。听起来您希望能够进行 OLAP 类型的查询,为此您应该使用更适合该目的的工具。

【讨论】:

  • 感谢 Aaron foto 您的回答。我有点希望在集群键上使用商家分区键和 timuuid 会仅为该分区创建索引,保持快速。我不熟悉 olap,但它看起来像是用于分析,而不是检索用户 ID。 (我看着阿帕奇麒麟)。你觉得什么样的西装更合适? hadoop 也许?
  • 我们将尝试使用 hadoop 来解决这个问题
猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2017-08-10
  • 2019-02-09
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多