java - 使用 Java 将数据从 Cassandra 中的一个表复制到另一个表

标签 java cassandra datastax cql

我正在尝试将所有数据从一个列族(表)移动到另一个列族。由于两个表都有不同的描述,因此我必须从 table-1 中提取所有数据并为 table-2 创建一个新对象,然后执行批量 aync 插入。我的 table-1 有数百万条记录,因此我无法直接获取数据结构中的所有数据并计算出来。我正在寻找使用 Spring Data Cassandra 和 Java 轻松实现这一点的解决方案。

我最初计划首先将所有数据移动到临时表,然后创建一些复合键关系,然后查询我的主表。然而,这对我来说似乎并不有利。谁能建议一个好的策略来做到这一点?任何线索将不胜感激。谢谢!

最佳答案

My table-1 has millions of records so I cannot get all the data directly in my data structure and work that out.

使用datastax java驱动程序,您可以通过token ranges获取所有数据并计算出每个 token 范围的数据。例如:

Set<TokenRange> tokenRanges = cassandraSession.getCluster().getMetadata().getTokenRanges();

for(TokenRange tr: tokenRanges) {
    List<Row> rows = new ArrayList<>();
    for(TokenRange sub: tr.unwrap()){
        String query = "SELECT * FROM keyspace.table WHERE token(pk) > ? AND token(pk) <= ?";
        SimpleStatement st = new SimpleStatement( query, sub.getStart(), sub.getEnd() );
        rows.addAll( session.execute( st ).all() );
    }
    transformAndWriteToNewTable(rows); 
}

每个 token 范围仅包含所有数据的一部分,并且可以由一台物理机器处理。您可以独立(并行或异步)处理每个 token 范围以获得更高的性能。

关于java - 使用 Java 将数据从 Cassandra 中的一个表复制到另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43274928/

相关文章:

java - PDFBox 2 不创建 PDF/A 文件

go - 如何用GO语言创建持久的cassandra连接?

Cassandra 移动 data_file_firectories

node.js - Cassandra nodejs eachRow 在数据库查询完成之前返回

java - 这个有效的 Java 代码如何? (混淆的Java)

java - Hibernate 对 Spring-WS 无响应

c++ - 在 Cassandra 中使用回调函数

database - Cassandra - 忽略 Where 子句中的主键 UUID

java - 无法在 NetBeans IDE 中使用嵌入式 Derby 连接生成 Hibernate 逆向工程

java - 将嵌套 Json 导入 cassandra