使用带有varchar密钥的CQL3在Cassandra中分配大型结果集

时间:2014-05-12 13:45:29

标签: 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:无效的类型   对于CQL类型varchar的值0,期望类java.lang.String但是   提供了类java.lang.Integer

当然,链接上的示例使用数字键。有没有办法用varchar(UTF8Type)键做到这一点?

现在似乎有一个内置的功能(https://issues.apache.org/jira/browse/CASSANDRA-4415),但我找不到让我走的例子。此外,我现在必须为Cassandra 1.2.9解决它。

1 个答案:

答案 0 :(得分:1)

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

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

相关问题