繁体   English   中英

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

[英]Copy data from one table to other in Cassandra using Java

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

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

我的表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); 
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM