我正在尝试了解Cassandra以及如何构建我的列族(CF),但由于习惯了关系数据库,所以很难。
例如,如果我创建简单的users
CF并且我尝试插入新行,那么如何在MySQL中创建增量键?
我看到很多例子,你只需要输入用户名而不是唯一的ID,这会有点意义,但是如果我希望用户拥有重复的用户名呢?
另外,如何根据我的理解进行搜索cassandra不会支持>
运算符,因此select * from users where something > something2
之类的内容无效。
可能最重要的问题是关于分组的问题?我是否需要检索所有数据,然后使用我正在使用的任何语言过滤它?我认为这会大大减慢我的系统速度。
所以基本上我需要一些简短的解释如何开始使用Cassanda。
答案 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的搜索选项。很多有趣的问题!
答案 2 :(得分:1)
您可以查看PlayOrm。虽然我同意您需要打破RDBMS思维,但有时将主键作为用户ID是错误的选择。有时这是正确的选择(取决于您的要求)。
PlayOrm是noSQL和关系概念的混合体,因为您需要两者并且您可以使用连接和所有内容来执行Scalable-SQL。您只需要将您认为会增长的表分区为数十亿/数万亿行,然后您可以查询这些分区。即使使用CQL,您也需要对表进行分区。你有什么分区?对于某些用例来说,时间是好的。其他人可以被客户端分区,因为每个客户端实际上都是noSQL集群中的迷你数据库。
就密钥而言,PlayOrm会生成唯一的“群集”密钥,这些密钥是hostname-uniqueidinThatHost,基本上类似于TimeUUID,除非我们在a1,a2,a3等群集中使用主机名,因此更短,更易读。等