我有数十亿条记录,其中包含15个字段,我想将它们插入到Cassandra(使用Java api)中。由于我的查询搜索键可以是五个不同记录字段之一(即对字段3或7或8或13或14的搜索查询),因此我在Cassandra中创建了5个相同的表,其中具有不同的主键(类似注释在enter link description here中提到)。
现在,我读取一条记录(或一批记录),并调用5次“插入Cassandra”。
我想知道Cassandra中是否有一种机制可以让我调用一次“插入Cassandra”并将记录自动存储到5个表中?
例如,记录一次存储在MemTable中(从我的代码中一次插入到我的代码中),而Cassandra核心将它们存储在SSTable中的5个表中?
答案 0 :(得分:1)
自Cassandra 3.0 there is support起提供了可以帮助您的物化视图。但是您需要仔细设计源表,因为与源表相比,如何更改实例化视图的结构存在很多限制-最明显的是: *您最多可以在源表的主键中不存在的一列中添加主键; *实例化视图的主键应包含源表主键的所有组件,但是您可以在主键中使用不同的列顺序。 *实体化视图的主键的所有列均应为非空。
您可以在this blog post中找到有关这些限制的更多详细信息。
您还需要注意更改分区键,以免获得较大的分区(但是,如果手动写入数据,可能会遇到相同的问题)。另外,还要考虑到这会给协调器节点增加更多的负载,如果更改分区键,则需要将数据分发到其他服务器-当您“手动”写入数据时,驱动程序将直接向保存该数据的副本发送请求。>
创建实例化视图is in the documentation的语法-与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`的两列。