使用Cassandra中的现有数据对两个Cassandra列族进行非规范化

时间:2015-12-18 01:14:40

标签: cassandra denormalization

我在Cassandra有两个具有相同结构的列系列:

  CREATE TABLE keyspace.table (
        id bigint,
        firstname text,
        lastname text,
        countryId bigint,
        cityId bigint,
        solr_query text,
        PRIMARY KEY (id)
    ) ;

在第二个表中,行数是第一个表中的三倍。 例如,在第一个表中,我将拥有行(firstname,lastname,countryId):

John, Doe, 100, 8

在第二个表中我会有行(firstname,lastname,countryId):

John, Doe, 222, 1
John, Doe, 100, 8
John, Doe, 333, 9

我需要使用集合创建一个列族,这样我只有一行与John Doe一起使用主countryId(100),以及其他集合。我添加了一个用户定义的data_type:

CREATE TYPE hints_info (
  countryId bigint,
  cityId bigint
);

并在我的第一个列系列中添加了一个集合:

ALTER TABLE table1 ADD hints map<int, frozen <hints_info>>;

因此,对于上面的示例,我的行看起来像:

John, Doe, 100, "{1: {countryId :222, cityId :1}, 2: {countryId :333, cityId :9}}"

我可以从卡桑德拉那里做到吗?使用CQL?要从第一列族中获取每一行,请将其与第二列族中的一行匹配,并在集合中添加第一列族中不存在的缺失信息? 我的所有数据都是在Cassandra中导入的。 例如,如果我使用C#,那么使用我的第二列系列中的数据从现有列系列更新我的集合的语法是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

Cassandra不支持你从一张桌子读取并插入另一张桌子的东西。 CQL适用于简单的读/写操作,并且不像关系世界那样具有复杂的查询支持。

我建议制作具有所需结构的第三个表格,并慢慢地从2个原始表格中复制数据,直到您满意为止。原因是您可以让应用程序使用现有的表结构,在后台进行迁移,如果出现问题,您可以在原始表中使用数据。在您满意之后,您只需将应用程序逻辑更改为从新表中读取。

至于迁移,你有几个选择:

  1. 在你的应用程序中处理这个作为backgorund作业,它将从两个表中提取,执行应用程序逻辑并插入新表中
  2. 使用具有Cassandra connector的Spark并具有数据转换工具并可以在新表中返回数据
  3. 我们创建了小migration tool,它完成了这个,它有Schema和Data迁移,你可以编写数据迁移,它从两个原始表中提取并写入新表
  4. 选项2.对于这个用例有很多开销,因为你必须安装和理解全新工具(Spark),这就是我们为这种小型ETL任务创建C#,Java和Scala迁移工具的原因。选项1.是最简单的,如果你的代码中有基础设施来做后台工作,那就去做吧。