如何扫描整个cassandra表,其中有10B条目,没有索引?

jogvjijk  于 2023-08-04  发布在  Cassandra
关注(0)|答案(3)|浏览(150)

我有一个cassandra数据库,其中包含一个超过10B条目的表,没有索引。我需要得到每一行并进行一些数据分组。然而,我使用了java和spring Boot framework,它只扫描了2B记录,这是cassandra对select * 的限制,来自abc.abc,如下所示:https://issues.apache.org/jira/browse/CASSANDRA-14683在java中有没有办法做到这一点?我尝试了ds bulk,但它计算整个表,并且不读取每一行。

qlfbtfca

qlfbtfca1#

您提到的问题CASSANDRA-14683是指没有特定分区键的SELECT语句最多只能扫描20亿行的限制。
解决这个问题的另一种方法是使用标记范围的分页,并分块读取数据,直到获取所有数据。
类似于下面的内容:

private static final int PAGE_SIZE = 10000; // Number of rows to fetch per page

public void getData() {
    try (CqlSession session = CqlSession.builder().build()) {
        Metadata metadata = session.getMetadata();
        TokenRange fullRange = metadata.getTokenMap().get().getPagingTokenRange();
        PagingIterable<Row> rows = session.execute(createPagingQuery(fullRange));
        for (Row row : rows) {
            // Process your data
        }
    }
}

private String createPagingQuery(TokenRange range) {
    return "SELECT * FROM YOUR_TABLE WHERE token(partition_key) >= " + range.getStart().getValue()
            + " AND token(partition_key) <= " + range.getEnd().getValue()
            + " LIMIT " + PAGE_SIZE;
}

字符串

nom7f22z

nom7f22z2#

我不知道扫描是什么意思,但是当你想在Cassandra表中获取所有数据时,你有两个选择:
双散Spark
尝试执行像select * from foo.bar这样的查询永远不会高效,并且很可能会在10B行时超时。
以上两个应用程序将查询分解为分区范围查询,您可以设置节流阀来限制操作的数量,这样您就不会得到同样的超时。
使用dsbulk,您可以获得一个计数,或者如果需要,您可以将数据卸载到csv。

4ktjp1zp

4ktjp1zp3#

处理这样的数据量是完全可能的。
您的问题可能与抽象层(Spring Data Cassandra)有关。Java驱动程序可以轻松地处理这一数量的数据,具有2个功能(可以同时使用):

***寻呼:**非常好describe in the documentation
*通过令牌Map将查询分发到多个节点(map/reduce)之间。要做到这一点,您正在使用其他描述的TokenRanges。你也可以在official documentation中了解更多。
1/ Spark

Spark使用令牌范围技巧。你应该看看Spark Cassandra Connector(SCC)。现在它是scala和spark运行时。

2/ DSBulk

只允许数据复制或计数,因此不能用于处理数据。

3/ Apache Beam

一个不那么出名的分布式处理方式。它还在节点之间分配负载,并且与Java兼容。我有一些sample

相关问题