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

发布于 2021-01-29 20:48:17

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

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

关注者
0
被浏览
132
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我的表1有数百万条记录,因此我无法直接在我的数据结构中获取所有数据并进行计算。

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

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看