使用Astyanax列出Cassandra列族中的所有行

时间:2013-02-05 03:01:14

标签: cassandra paging cql astyanax

我有一些与Cassandra相关的问题:

我必须存储一些数据(大约10M行)(比方说一个自然键 - 可排序,更新时间戳,createDate(仅限YYYYMMDD)和值字段。我打算创建以下CF

CREATE TABLE data (
  id text,
  createdate text,
  updatedate timeuuid,
  value text,
  PRIMARY KEY (id, updatedate)
);

CREATE TABLE data_createdate (
  id text,
  createdate text,
  value text,
  PRIMARY KEY (id, createdate)
);

我的使用情况查询将如下:

  • 获取所有行(id,value,createdate,updatedate),这样CQL就可以了 SELECT * FROM data

我正在使用Astyanax,我该如何进行分页?我是否必须按顺序保留分区程序,因此我可以在范围值中使用token(id)来翻页。

  • 获取具有更新范围的所有行,因此像这样的CQL会这样做 SELECT * FROM data where updatedate > startdate and updatedate < enddate

同样,我该如何进行分页?

  • 获取具有createdate范围的所有行,它与上面的问题类似,但我可以针对data_createdate CF运行CQL。再次,我该如何进行分页?

有任何建议和意见吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

如果要实现分页,请尝试存储上次检索到的集合中的最后一个密钥,以便下次要获取下一个页面切片时,查询的入口点将是最后保存的密钥。建议你通过这个链接 http://www.datastax.com/docs/1.2/cql_cli/using/paging

答案 1 :(得分:1)

通常,您希望避免任何需要迭代列族中所有键的内容。就像在RDBM中一样,您应该只进行具有正确索引设置的查询。

由于updatedatedata表的复合行键的一部分,因此您可以对该列使用范围查询来进行分页(确切地说,如何在Cassandra中进行分页是一个非常复杂的主题,不幸的是)。这意味着您的两个第一个用例实际上是相同的。

我不确定你的意思是第三种情况,你的意思是你想在data中使用createdate的范围查询来查询行 - 例如SELECT * FROM data WHERE createdate > '20130206' AND createdate < '20130228'?我对你的第二张桌子(data_createdate)以及它适合的位置感到困惑。

如果您的意思是我认为您的意思是一个解决方案可能是在createdatedata)的CREATE INDEX data_createdate_index ON data (createdate)列中添加辅助索引。 You can read more about secondary indexing in the documentation