我在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#,那么使用我的第二列系列中的数据从现有列系列更新我的集合的语法是什么?
谢谢!
答案 0 :(得分:0)
Cassandra不支持你从一张桌子读取并插入另一张桌子的东西。 CQL适用于简单的读/写操作,并且不像关系世界那样具有复杂的查询支持。
我建议制作具有所需结构的第三个表格,并慢慢地从2个原始表格中复制数据,直到您满意为止。原因是您可以让应用程序使用现有的表结构,在后台进行迁移,如果出现问题,您可以在原始表中使用数据。在您满意之后,您只需将应用程序逻辑更改为从新表中读取。
至于迁移,你有几个选择:
选项2.对于这个用例有很多开销,因为你必须安装和理解全新工具(Spark),这就是我们为这种小型ETL任务创建C#,Java和Scala迁移工具的原因。选项1.是最简单的,如果你的代码中有基础设施来做后台工作,那就去做吧。