我一直读到,如果你的应用程序经常更改,功能经常添加,cassandra是很好的。
这是有意义的,因为您没有任何固定的模式,所以可以向行中添加列以满足您的需要,而不是运行alter table查询,因为alter table查询可能会为非常大的表冻结数据库数小时。
然而,我有一个我无法解决的算术问题。假设我有:
CREATE COLUMN FAMILY Students
with comparator='CompositeType(UTF8Type,UTF8Type),
and key_validation_class=UUIDType;
每个学生都有一些通用列(你知道,meta:username, meta:password, meta:surname等),加上每个学生可以学习n门课程。这个n-n关系是通过反规范化来解决的,为每个学生添加n列(course:id1, course:id2).
另一方面,我可能有一个courses cf,其中每一行都包含以下所有学生的uuid。
所以我可以问“哪些课程后面跟着”和“哪些学生后面跟着yyy”。
问题是:如果我没有创建第二列族呢?也许在构建应用程序时,让学生学习特定的课程并不是一项要求。
这是一个简单的例子,但我相信这很常见。”使用cassandra,您可以根据查询而不是关系来规划cfs”。我现在需要那个查询,但一开始不需要。
如果有上千个学生的表格,你会如何填写课程?这是hadoop、pig还是hive的工作(我从来没有碰过这些,只是猜测而已)。
2条答案
按热度按时间14ifxucb1#
pig(使用hadoop集成)实际上非常适合这种类型的工作,因为您不仅可以使用cassandrastorage读取数据,还可以将数据写回cassandra。它提供了并行处理能力,可以用最少的时间和开销完成这项工作。否则,另一种方法是自己写一些东西来进行提取,然后编写新的cf。
以下是一个pig示例,它从一个cf中的一组数据计算平均值并将其输出到另一个cf:
afdcj2ne2#
如果使用现有的cassandra文件,则必须展开数据。由于nosql文件是单向的,这在cassandra本身中可能是一个非常耗时的操作。数据必须按照与第一个文件相反的顺序排序。坦率地说,我相信您必须返回用于填充第一个文件的原始数据,并从中填充这个新文件。