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

时间:2017-04-07 09:47:27

标签: java cassandra datastax cql

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

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

2 个答案:

答案 0 :(得分:2)

  

我的table-1有数百万条记录,因此无法直接在我的数据结构中获取所有数据并将其解决。

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

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); 
}

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

答案 1 :(得分:1)

您可以使用Apache Spark Streaming
从技术上讲,您将从第一个表中读取数据,进行实时转换并写入第二个表 注意,我更喜欢Spark scala API,因为它有更优雅的API和流媒体作业代码会更简洁。但是如果你想使用纯Java来做,那就是你的选择。