首页 > 解决方案 > 将相同的记录插入具有不同主键的多个表中

问题描述

我有 15 个字段的数十亿条记录,我想将它们插入 Cassandra(使用 Java api)。由于我的查询搜索键可以是五个不同的记录字段之一(即在字段 3 或 7 或 8 或 13 或 14 上搜索查询),因此我在 Cassandra 中创建了 5 个具有不同主键的相同表(类似于注释在此处输入链接描述中提到)。

现在我读了一条记录(或一批记录)并调用“插入 Cassandra”5 次。

我想知道 Cassandra 中是否有一种机制可以让我调用一次“插入 Cassandra”并将记录自动存储到 5 个表中?

例如,记录一次存储在 MemTable 中(从我的代码通过一次插入),Cassandra 核心将它们存储在 SSTable 的 5 个表中?

标签: cassandranosql

解决方案


Cassandra 3.0 开始,支持物化视图可以帮助您。但是您需要仔细设计源表,因为与源表相比,如何更改物化视图的结构存在许多限制 - 最值得注意的是:*您最多可以向主键添加一个不是在源表的主键中;* 物化视图的主键应该包含源表主键的所有组成部分,但您可以在主键中使用不同的列顺序。*物化视图的主键的所有列都应该是非空的。

您可以在此博客文章中找到有关这些限制的更多详细信息。

您还需要小心更改分区键以不获取大分区(但如果您手动写入数据,您可能会遇到同样的问题)。此外,考虑到这会增加协调节点的负载,如果分区键更改,则需要将数据分发到其他服务器 - 当您“手动”写入数据时,驱动程序将直接向保存该数据的副本发送请求。

创建物化视图的语法在文档中- 它与 SQL 非常相似但不完全一样(来自文档的示例):

CREATE TABLE cyclist_mv (cid UUID PRIMARY KEY, 
   name text, age int, birthday date, country text);

CREATE MATERIALIZED VIEW cyclist_by_age 
  AS SELECT age, birthday, name, country 
  FROM cyclist_mv 
  WHERE age IS NOT NULL AND cid IS NOT NULL 
  PRIMARY KEY (age, cid);

在这种情况下,我们从主键 ( cid) 中的一列移动到主键 ( age, 和cid). Note the explicit check for non-NULL values in theWHERE 条件中的 2 列。


推荐阅读