Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cassandra中使用Java将数据从一个表复制到另一个表_Java_Cassandra_Datastax_Cql - Fatal编程技术网

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

在Cassandra中使用Java将数据从一个表复制到另一个表,java,cassandra,datastax,cql,Java,Cassandra,Datastax,Cql,我正在尝试将所有数据从一个列族(表)移动到另一个列族(表)。由于两个表有不同的描述,我必须从表1中提取所有数据,并为表2创建一个新对象,然后执行批量aync插入。我的表1有数百万条记录,因此我无法直接在数据结构中获取所有数据并计算出来。我正在寻找解决方案,以便使用SpringDataCassandra和Java轻松实现这一点 我最初计划首先将所有数据移动到临时表,然后创建一些复合键关系,然后查询回主表。然而,这似乎对我不利。有人能提出一个好的策略吗?任何线索将不胜感激。谢谢 你可以用从技术上讲,

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

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

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

您可以使用
从技术上讲,您将从第一个表读取数据,进行动态转换并写入第二个表。
注意,我更喜欢Spark scala API,因为它有更优雅的API,流式作业代码更简洁。但是,如果您想使用纯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); 
}
Set-tokenRanges=cassandraSession.getCluster().getMetadata().getTokenRanges();
for(TokenRange tr:tokenRanges){
列表行=新建ArrayList();
对于(TokenRange sub:tr.unwrap()){
String query=“从keyspace.table中选择*,其中标记(主键)>?和标记(主键)
我的表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); 
}
Set-tokenRanges=cassandraSession.getCluster().getMetadata().getTokenRanges();
for(TokenRange tr:tokenRanges){
列表行=新建ArrayList();
对于(TokenRange sub:tr.unwrap()){

String query=“从keyspace.table中选择*,其中标记(主键)>?和标记(主键)两个表架构之间的区别是什么?表1有3列—item、value和一个blob对象。表2有item、value和作为blob一部分的其他10列。两个表架构之间的区别是什么?表1有3列—item、value和blob对象。表2有item、value和作为t一部分的其他10列he blob.谢谢你的建议。这只能通过使用java来完成。谢谢你的建议。这只能通过使用java来完成。谢谢。我一直在使用tokenRanges本身。但是,我有点困惑,如果我在我的键空间上设置了复制因子,这将如何表现。比如,我正在尝试从键空间中获取记录,并且复制因子为3。这意味着,相同的数据将驻留在三台主机中。它们是否具有相同的哈希值?我猜没有。如果使用令牌方法,我如何区分是否是重复/冗余/复制的数据?哈希值不取决于复制因子,它只取决于分区器和分区键值。当您查询使用token函数的数据,它不会返回重复的数据,这与按分区键查询的工作方式相同。请参阅此处的“关于数据分布”。上面的代码返回的行数与常规查询“select count(*)相同从表'for keyspace with replication n factor=3Thanks,在这种情况下,在使用令牌范围时,我不必担心复制因子,因为它总是会给我一行新的数据,而不管复制因子是多少,种子是多少?它会给每个分区键一行,但不要忘记最终的一致性,这些数据可以是ale,请正确设置一致性级别以始终获取最新数据。谢谢。我正在使用tokenRanges本身。但是,我有点困惑,如果我在密钥空间上设置了复制因子,这将如何运行。例如,我正在尝试从密钥空间获取记录,而它的复制因子为3。这意味着,相同的数据将是剩余的在三台主机中运行。它们是否具有相同的哈希值?我猜没有。如果使用令牌方法,我如何区分其是否为重复/冗余/复制数据?哈希值不取决于复制因子,它仅取决于分区器和分区键值。当使用令牌函数查询数据时,它不会返回重复数据,这对sa有效按分区键查询。请参阅此处的关于数据分布。上面的代码返回与常规查询“选择计数(*)相同的行数从表'for keyspace with replication n factor=3Thanks,在这种情况下,在使用令牌范围时,我不必担心复制因子,因为它总是会给我一行新的数据,而不管复制因子是多少,种子是多少?它会给每个分区键一行,但不要忘记最终的一致性,这些数据可以是ale,正确设置一致性级别以始终获取最新数据。