cassandra - 将相同的记录插入具有不同主键的多个表中
问题描述
我有 15 个字段的数十亿条记录,我想将它们插入 Cassandra(使用 Java api)。由于我的查询搜索键可以是五个不同的记录字段之一(即在字段 3 或 7 或 8 或 13 或 14 上搜索查询),因此我在 Cassandra 中创建了 5 个具有不同主键的相同表(类似于注释在此处输入链接描述中提到)。
现在我读了一条记录(或一批记录)并调用“插入 Cassandra”5 次。
我想知道 Cassandra 中是否有一种机制可以让我调用一次“插入 Cassandra”并将记录自动存储到 5 个表中?
例如,记录一次存储在 MemTable 中(从我的代码通过一次插入),Cassandra 核心将它们存储在 SSTable 的 5 个表中?
解决方案
从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 the
WHERE 条件中的 2 列。
推荐阅读
- pandas - MultiIndexing and plotting using pandas
- c# - Unit testing - unexpected result from lambda expression in mock object
- stenciljs - How to fetch data from a local JSON file in StencilJS?
- vue.js - 在自定义模块中找不到函数 - VueJS
- bash - 来自变量的 Bash 大括号扩展
- javascript - React/Redux 无法读取未定义的属性“currentOpportunities”
- python - 在使用建议的 python 文件时遇到无效的语法
- google-apps-script - 当单元格仅包含等号时,getValues/setValues 创建 #ERROR
- nexmo - 出站呼叫 dtmfAnswer 在来自 answer_url 的 NCCO 上播放
- r - 从 git 读取 rds 压缩文件