当前位置: 首页 > 知识库问答 >
问题:

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

商辰钊
2023-03-14

我在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

我只需要使用集合创建一个列系列,这样我就只有一行与主 countryId (100) 的 John Doe,而其他列的集合。我添加了一个用户定义的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个答案

茹建茗
2023-03-14

Cassandra不支持从一个表读取并插入另一个表的情况。CQL适合简单的读/写操作,并且不像关系世界那样具有复杂的查询支持。

我建议用所需的结构制作第三个表,并从两个原始表中缓慢复制数据,直到您满意为止。这样做的原因是,您可以让应用程序使用现有的表结构,在后台进行迁移,如果出现问题,您可以在原始表中保存html" target="_blank">数据。在您满意之后,只需更改应用程序逻辑以从新表中读取。

至于迁移,您有几种选择:

  1. 将其作为backgorund作业在您的应用程序中处理,该作业将从两个表中提取,执行应用程序逻辑并插入新表
  2. 为此使用Spark,它具有Cassandra连接器并具有数据转换工具,并且可以在新表中根据需要返回数据
  3. 我们创建了小型迁移工具,它可以执行此操作,它具有Schema和Data迁移,您可以编写从两个原始表中提取并写入新表的Data迁移

选项2。因为您必须安装并理解全新的工具(Spark ),所以我们为这种小型ETL任务创建了C#、Java和Scala的迁移工具。备选方案1。是最简单的,如果你的代码中有做后台工作的基础设施,那就去做吧。

 类似资料:
  • 我阅读了cassandra数据建模,除了非规范化数据可能会发生变化之外,一切都很清楚。我如何同步它?当用户电子邮件更改时,更新的方法是什么: < code>groupname是组的一部分,数据模型中的用户可能不知道任何组,因此在用户更改后无法更新电子邮件。 下面描述的解决方案是否合适? 向用户模型中添加一列(类型

  • 我目前正在进行一个新的项目,并选择了Cassandra作为我们的数据存储。我有一个用例,我存储材料的价格,为了实现它,我创建了用户定义类型(UDT)列表。但不幸的是,在使用datastax驱动程序进行反序列化时。在查询所需数据之后,我发现list对象为null,而在数据库中有它的值。这是Cassandra java驱动程序的当前限制还是我遗漏了什么? 这就是我的UDT的样子: 在Cassandra

  • 我试图在Cassandra CLI版本1.1.6中创建一个列族,我不确定如何将主键指定为MovieID。

  • 我正在用现有的卡桑德拉数据库进行一个项目。架构如下所示: 我的问题是:在json字符串中存储数据有什么好处吗?它会节省一些空间吗? 到目前为止,我只发现了缺点: 您不能(轻松)在运行时添加/删除列,因为应用程序可以覆盖 json 字符串列。 解析 json 字符串目前是性能方面的瓶颈。