19

我正在尝试了解 Cassandra 以及如何构建我的列族 (CF),但这非常困难,因为我习惯了关系数据库。

例如,如果我创建简单的usersCF 并尝试插入新行,如何像在 MySQL 中一样创建增量键?

我看到了很多示例,您只需输入用户名而不是唯一 ID,这会有点道理,但是如果我希望用户拥有重复的用户名怎么办?

另外,当我了解 cassandra 不支持运营商时,我该如何进行搜索>,所以类似的东西select * from users where something > something2不起作用。

也许最重要的问题是分组呢?我是否需要检索所有数据,然后使用我使用的任何语言对其进行过滤?我认为这会大大降低我的系统速度。

所以基本上我需要一些简短的解释如何开始使用 Cassanda。

4

3 回答 3

17

你的问题很笼统,但让我试一试。首先,您需要根据查询对数据进行建模。使用 RDBMS,您可以以某种规范化形式对数据进行建模,然后针对您的特定查询进行优化。Cassandra 无法做到这一点。您必须按照您打算读取的方式写入数据。这通常意味着以不止一种方式编写它。一般来说,如果您想有效地使用 Cassandra,它有助于完全摆脱您的 RDBMS 思维。

关于键:

  • 它们在 Cassandra 中用作跨环的分布单位。因此,您的密钥将被散列并在环中分配一个“所有者”。使用 RandomPartitioner 保证均匀分布

  • 假设您使用 RandomPartitioner(您应该),键没有排序。这意味着您不能要求一系列密钥。但是,您可以在单个查询中请求键列表。

  • 键在某些模型中是相关的,而在其他模型中则不相关。如果您的模型需要按键查询,您可以使用您的应用程序知道的任何唯一值(例如 UUID)。有时键是标记值,例如表示一天开始的 Unix 纪元。这使您可以交给 Cassandra 一堆已知键,然后获得按列排序的一系列数据(见下文)。

关于查询谓词:

  • 假设您正确建模以回答您的查询,您可以获得一系列数据。

  • 由于列是按排序顺序写入的,因此您可以使用切片查询(非常快)查询从 A 列到 n 列的范围。您还可以使用复合列来稍微抽象一下这种机制。

  • 您可以在基数较低的列上使用二级索引——这为您提供了按值查询的功能。

  • 您可以创建自己的索引,其中数据按您需要的方式排序。

关于分组:

我想你指的是创建聚合。如果您需要实时数据,您将需要使用一些外部机制(如Storm)来跟踪数据并不断将相关聚合更新到 CF 中。如果您在批处理过程中创建聚合,Cassandra 与 Hadoop 具有出色的集成,允许您使用 Pig、Hive 或直接使用您选择的语言编写 map/reduce 作业。

于 2012-10-03T14:17:28.557 回答
7

对于你的第一个问题:

我可以像在mysql中那样制作增量密钥吗

不,不是真的——不是 Cassandra 本地人。 如何在 Cassandra 中创建自动增量 ID——您可以在此处查看更多信息: http ://srinathsview.blogspot.ch/2012/04/generating-distributed-sequence-number.html

您的第二个问题更多关于您如何存储和建模 Cassandra 数据。

查看 stackoverflow 的搜索选项。很多有趣的问题!

  1. 从 MySQL 切换到 Cassandra - 优点/缺点?
  2. 卡桑德拉数据模型
  3. Cassandra/NoSQL 新手:正确的建模方式?
  4. Apache Cassandra 架构设计
  5. Apache Cassandra 的知识源

最重要的是,什么时候不使用 Cassandra?

于 2012-10-03T16:13:29.210 回答
1

您可能想查看 PlayOrm。虽然我同意你需要打破 RDBMS 思维,但有时将主键作为用户 ID 是错误的选择。有时这是正确的选择(取决于您的要求)。

PlayOrm 是 noSQL 和关系概念的混合体,因为您需要两者,并且您可以使用连接和所有内容执行 Scalable-SQL。您只需要对您认为会增长到数十亿/万亿行的表进行分区,然后就可以查询这些分区。即使使用 CQL,您也需要对表进行分区。你可以根据什么来划分?对于某些用例来说,时间是好的。其他的可以由客户端分区,因为每个客户端实际上都是你的 noSQL 集群中的一个小型数据库。

就密钥而言,PlayOrm 会生成唯一的“集群”密钥,即主机名-uniqueidinThatHost,基本上类似于 TimeUUID,只是在我们在 a1、a2、a3 等集群中使用主机名时更短且更具可读性。

于 2012-10-03T15:59:32.750 回答