使用 Java 将数据从一个 table 复制到 Cassandra 中的另一个
Copy data from one table to other in Cassandra using Java
我正在尝试将所有数据从一个列族 (table) 移动到另一个列族。由于两个 table 都有不同的描述,我必须从 table-1 中提取所有数据并为 table-2 创建一个新对象,然后进行批量 aync 插入。我的 table-1 有数百万条记录,所以我无法直接在我的数据结构中获取所有数据并计算出来。我正在寻找使用 Spring Data Cassandra 和 Java.
轻松做到这一点的解决方案
我最初计划将所有数据移动到临时 table,然后创建一些复合键关系,然后查询我的主数据 table。但是,这似乎对我不利。谁能建议一个好的策略来做到这一点?任何线索将不胜感激。谢谢!
您可以使用 Apache Spark Streaming。
从技术上讲,您将从第一个 table 读取数据,进行即时转换并写入第二个 table。
请注意,我更喜欢 Spark scala API,因为它更优雅 API 并且流式作业代码会更简洁。但是,如果您想使用纯 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 获取所有数据并计算出每个标记范围内的数据。例如:
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);
}
每个令牌范围只包含所有数据的一部分,可以由一台物理机处理。您可以独立(并行或异步)处理每个令牌范围以获得更高的性能。
我正在尝试将所有数据从一个列族 (table) 移动到另一个列族。由于两个 table 都有不同的描述,我必须从 table-1 中提取所有数据并为 table-2 创建一个新对象,然后进行批量 aync 插入。我的 table-1 有数百万条记录,所以我无法直接在我的数据结构中获取所有数据并计算出来。我正在寻找使用 Spring Data Cassandra 和 Java.
轻松做到这一点的解决方案我最初计划将所有数据移动到临时 table,然后创建一些复合键关系,然后查询我的主数据 table。但是,这似乎对我不利。谁能建议一个好的策略来做到这一点?任何线索将不胜感激。谢谢!
您可以使用 Apache Spark Streaming。
从技术上讲,您将从第一个 table 读取数据,进行即时转换并写入第二个 table。
请注意,我更喜欢 Spark scala API,因为它更优雅 API 并且流式作业代码会更简洁。但是,如果您想使用纯 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 获取所有数据并计算出每个标记范围内的数据。例如:
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);
}
每个令牌范围只包含所有数据的一部分,可以由一台物理机处理。您可以独立(并行或异步)处理每个令牌范围以获得更高的性能。