如何从其他列填充cassandra列族?

mfuanj7w  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(319)

我一直读到,如果你的应用程序经常更改,功能经常添加,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的工作(我从来没有碰过这些,只是猜测而已)。

14ifxucb

14ifxucb1#

pig(使用hadoop集成)实际上非常适合这种类型的工作,因为您不仅可以使用cassandrastorage读取数据,还可以将数据写回cassandra。它提供了并行处理能力,可以用最少的时间和开销完成这项工作。否则,另一种方法是自己写一些东西来进行提取,然后编写新的cf。
以下是一个pig示例,它从一个cf中的一组数据计算平均值并将其输出到另一个cf:

rows = LOAD 'cassandra://HadoopTest/TestInput' USING CassandraStorage() AS (key:bytearray,cols:bag{col:tuple(name:chararray,value)});
columns = FOREACH rows GENERATE flatten(cols) AS (name,value);
grouped = GROUP columns BY name;
vals = FOREACH grouped GENERATE group, columns.value AS values;
avgs = FOREACH vals GENERATE group, 'Pig_Average' AS name, (long)SUM(values.value)/COUNT(values.value) AS average;    
cass_group = GROUP avgs BY group;   
cass_out = FOREACH cass_group GENERATE group, avgs.(name, average);
STORE cass_out INTO 'cassandra://HadoopTest/TestOutput' USING CassandraStorage();
afdcj2ne

afdcj2ne2#

如果使用现有的cassandra文件,则必须展开数据。由于nosql文件是单向的,这在cassandra本身中可能是一个非常耗时的操作。数据必须按照与第一个文件相反的顺序排序。坦率地说,我相信您必须返回用于填充第一个文件的原始数据,并从中填充这个新文件。

相关问题