卡桑德拉列键自动增量

时间:2012-10-03 13:13:44

标签: nosql cassandra

我正在尝试了解Cassandra以及如何构建我的列族(CF),但由于习惯了关系数据库,所以很难。

例如,如果我创建简单的users CF并且我尝试插入新行,那么如何在MySQL中创建增量键?

我看到很多例子,你只需要输入用户名而不是唯一的ID,这会有点意义,但是如果我希望用户拥有重复的用户名呢?

另外,如何根据我的理解进行搜索cassandra不会支持>运算符,因此select * from users where something > something2之类的内容无效。

可能最重要的问题是关于分组的问题?我是否需要检索所有数据,然后使用我正在使用的任何语言过滤它?我认为这会大大减慢我的系统速度。

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

3 个答案:

答案 0 :(得分:16)

你的问题非常笼统,但让我试一试。首先,您需要根据查询对数据建模。使用RDBMS,您可以以某种标准化形式对数据建模,然后针对特定查询进行优化。你不能用Cassandra做到这一点;您必须按照打算阅读的方式编写数据。通常这意味着以不止一种方式编写它。一般来说,如果你想与Cassandra一起有效地工作,它有助于彻底摆脱你的RDBMS。

关于键:

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

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

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

关于查询谓词:

  • 您可以通过正确建模来获取数据范围以回答您的问题。

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

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

  • 您可以创建自己的索引,以便按照您需要的方式对数据进行排序。

关于分组:

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

答案 1 :(得分:7)

关于你的第一个问题:

  

我可以像mysql一样制作增量密钥

不,不是真的 - 不是Cassandra原生的。 How to create auto increment IDs in Cassandra - 您可以在此处查看更多信息:http://srinathsview.blogspot.ch/2012/04/generating-distributed-sequence-number.html

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

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

  1. Switching from MySQL to Cassandra - Pros/Cons?
  2. Cassandra Data Model
  3. Cassandra/NoSQL newbie: the right way to model?
  4. Apache Cassandra schema design
  5. Knowledge sources for Apache Cassandra
  6. 最重要的是,When NOT to use Cassandra?

答案 2 :(得分:1)

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

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

就密钥而言,PlayOrm会生成唯一的“群集”密钥,这些密钥是hostname-uniqueidinThatHost,基本上类似于TimeUUID,除非我们在a1,a2,a3等群集中使用主机名,因此更短,更易读。等