复合键的Cassandra CQL分页

时间:2015-01-25 16:18:46

标签: java cassandra cql

是否有任何简单的方法可以通过分页查询宽行。我的架构是,

CREATE TABLE USER_LIKED_ITEMS (
user_id text,
event_id text,
item_id text,
description text,
PRIMARY KEY(user_id, event_id, item_id)
);

我想获取给定user_id的所有行(考虑到给定user_id的 500000行,具有event_id和item_id的各种组合),通过使用计数25进行分页。查询我有try select * from USER_LIKED_ITEMS where user_id = '101' LIMIT 25;一旦结果到达,则第25条记录的值为

user_id = 101,
event_id = 25,
item_id = 25,
description = XXXXX

我的下一个查询是,select * from USER_LIKED_ITEMS where user_id = '101' and event_id = '25' and item_id > '25' LIMIT 25;检索具有最后一个记录值的10条记录的结果,

user_id = 101,
event_id = 25,
item_id = 35,
description = XXXXX

所以我再次需要框架select * from USER_LIKED_ITEMS where user_id = '101' and event_id > '25'。因此,通过构建不同的查询以检索所有结果来检索所有结果是相当棘手和困难的。是否有任何简单的方法来获取给定user_id的所有记录,分页数为25?我正在使用cassandra-1.2.15和cassandra-driver-core-1.0.3.jar。 Cassandra2.0具有分页支持,但我不允许升级cassandra版本。

1 个答案:

答案 0 :(得分:1)

1.2到"page" through your results with the token() function and based on your partitioning key有一种方法(对你来说是user_id)。但我怀疑,如果只有user_id查询结果有任何价值(对你而言),你就会这样做。

可能对您有所帮助的一种解决方案是将数据复制到查询表中以解决此问题:

CREATE TABLE USER_LIKED_ITEMS_BY_PAGENO (
user_id text,
event_id text,
item_id text,
description text,
pageno bigint,
PRIMARY KEY(user_id, pageno, event_id, item_id)
);

当然这假设您在插入时知道哪些行属于哪个页面(可能每25个插入一次,您递增 pageno 或类似的东西) 。但如果你这样做了,你可以把它们放到这样的表中,然后SELECT就像这样:

select * from USER_LIKED_ITEMS_BY_PAGENO 
where user_id = '101' and pageno = 4;
相关问题