【问题标题】:Copy data from one table to other in Cassandra using Java使用 Java 在 Cassandra 中将数据从一个表复制到另一个表
【发布时间】:2017-09-02 15:35:41
【问题描述】:

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

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

【问题讨论】:

  • 两个表模式有什么区别?
  • 表 1 有 3 列 - 项、值和一个 blob 对象。表 2 有 item、value 和 10 个其他列,它们是 blob 的一部分。

标签: java cassandra datastax cql


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我正在使用 tokenRanges 本身。但是,如果我在我的键空间上设置了复制因子,我有点困惑这将如何表现。比如说,我试图从一个键空间中获取记录,它的复制因子为 3。这意味着相同的数据将驻留在三个主机中。他们会有相同的哈希吗?我觉得不是。如果我使用令牌方法,我如何区分它是否是重复/冗余/复制的数据?
  • 哈希不依赖于复制因子,它只依赖于分区器和分区键值。使用token函数查询数据时,不会返回重复数据,这与通过分区键查询相同。在此处查看数据分布docs.datastax.com/en/cassandra/3.0/cassandra/architecture/…
  • 上面的代码返回与复制因子 = 3 的键空间的常规查询“从表中选择计数(*)”相同的行数
  • 谢谢,在这种情况下,在使用 Token Range 时,我不必担心复制因子,因为无论复制因子如何,它都会给我一个新的数据行,我有种子吗?
  • 它会为每个分区键分配一行,但不要忘记最终一致性,这些数据可能是陈旧的,正确设置一致性级别以始终获取最新数据。
【解决方案2】:

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

【讨论】:

  • 感谢您的建议。它必须通过使用 java 来完成。
猜你喜欢
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2012-11-24
  • 2011-05-16
  • 2012-06-20
相关资源
最近更新 更多