java - 使用带有 varchar 键的 CQL3 对 Cassandra 中的大型结果集进行分页

标签 java cassandra cql3

我正在努力将旧的基于 thrift 的代码更新为 CQL3。

代码的一部分是遍历由 20M+ 行组成的表的整个数据集。这部分最初由于内存使用而导致程序崩溃,因此我创建了一个 RowIterator 类,它使用 TokenRanges (和 Hector)迭代列族。

当尝试使用 CQL3 重写此代码时,我在分页数据时遇到问题。我在 http://www.datastax.com/documentation/cql/3.0/cql/cql_using/paging_c.html 找到了一些信息,但是当在第一个“页面”尝试此代码时

resultSet = session.execute("select * from " + TABLE + " where token(key) <= token(" + offset + ")");

我收到错误

com.datastax.driver.core.exceptions.InvalidTypeException: Invalid type for value 0 of CQL type varchar, expecting class java.lang.String but class java.lang.Integer provided

当然,链接中的示例使用数字键。有没有办法使用 varchar (UTF8Type) 键执行此操作?

现在似乎有一个内置功能( https://issues.apache.org/jira/browse/CASSANDRA-4415 ),但我找不到让我继续下去的示例。另外,我现在必须为 Cassandra 1.2.9 解决这个问题。

最佳答案

因此,简单的答案是升级到 Cassandra 2.0.X 并使用新的内置分页功能。但要在 Cassandra 1.2 上完成它,您就走在正确的道路上。您的语法应该有效,如果您运行在 cqlsh 中尝试的查询,您是否会收到相同的错误?当像这样的分页时,最好像示例中那样使用“">”,这可能是问题所在。您希望从 select * from table limit 100 开始,然后转到 select * from table where token(key)>token('last key') limit 100

我也会尝试使用准备好的声明。字符串操作可能会对偏移量做一些有趣的事情。

关于java - 使用带有 varchar 键的 CQL3 对 Cassandra 中的大型结果集进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23610771/

相关文章:

java - 从整数转换为 BigInteger

cassandra - HIVE/HDFS 用于大规模实时存储传感器数据?

apache-spark - 为 Spark 集群和 Cassandra 设置和配置 Titan

cassandra - Cassandra 2.1.8上的非卡住集合和用户定义类型

java - 部署(发布)后出现 Weblogic 错误 : Error 503--Service Unavailable

java - 如何在 Hadoop MapReduce 中实现组合器?

java - 线程池按顺序运行

c# - Cassandra 节点在大量写入时失败

cassandra - 根据 Where 子句更新 Cassandra 中的列

cassandra - 如何在 cql3 查询选择中执行 "not in"过滤器?