我有一个cassandra数据库,其中包含一个超过10B条目的表,没有索引。我需要得到每一行并进行一些数据分组。然而,我使用了java和spring Boot framework,它只扫描了2B记录,这是cassandra对select * 的限制,来自abc.abc,如下所示:https://issues.apache.org/jira/browse/CASSANDRA-14683在java中有没有办法做到这一点?我尝试了ds bulk,但它计算整个表,并且不读取每一行。
我有一个cassandra数据库,其中包含一个超过10B条目的表,没有索引。我需要得到每一行并进行一些数据分组。然而,我使用了java和spring Boot framework,它只扫描了2B记录,这是cassandra对select * 的限制,来自abc.abc,如下所示:https://issues.apache.org/jira/browse/CASSANDRA-14683在java中有没有办法做到这一点?我尝试了ds bulk,但它计算整个表,并且不读取每一行。
3条答案
按热度按时间qlfbtfca1#
您提到的问题CASSANDRA-14683是指没有特定分区键的SELECT语句最多只能扫描20亿行的限制。
解决这个问题的另一种方法是使用标记范围的分页,并分块读取数据,直到获取所有数据。
类似于下面的内容:
字符串
nom7f22z2#
我不知道扫描是什么意思,但是当你想在Cassandra表中获取所有数据时,你有两个选择:
双散Spark
尝试执行像
select * from foo.bar
这样的查询永远不会高效,并且很可能会在10B行时超时。以上两个应用程序将查询分解为分区范围查询,您可以设置节流阀来限制操作的数量,这样您就不会得到同样的超时。
使用dsbulk,您可以获得一个计数,或者如果需要,您可以将数据卸载到csv。
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