I've run into the same problem, surprised nobody's responded to you. Any time someone asks "how do I page through all the rows of a table in CQL3?", the standard answer is token() and limit. But as you point out, this method will often miss some data from wide rows.

Maybe a Cassandra expert will chime in if we're wrong.

Your suggestion is possible if you know how to find the previous value of 'name' field (and are willing to filter out repeated rows), but wouldn't that be difficult/impossible with some keys? So then, is there a way to do paging queries that get ALL of the rows, even in wide rows?


On 08/13/2013 02:46 PM, Jan Algermissen wrote:
HI,

ok, so I found token() [1], and that it is an option for paging through 
randomly partitioned data.

I take it that combining token() and LIMIT is the CQL3 idiom for paging (set 
aside the fact that one shouldn't raelly want to page and use C*)

Now, when I page through a CF with wide rows, limitting each 'page' to, for 
example, 100 I end up in situations where not all 'sub'rows that have the same 
result for token() are returned because LIMIT chops off the result after 100 
'sub'rows, not neccessarily at the boundary to the next wide row.

Obvious ... but inconvenient.

The solution would be to throw away the last token returned (because it's wide 
row could have been chopped off) and do the next query with the token before.

So instead of doing

      SELECT * FROM users WHERE token(name) > token(last-name-of-prev-result) 
LIMIT 100;

I'd be doing

     SELECT * FROM users WHERE token(name) > 
token(one-befoe-the-last-name-of-prev-result) LIMIT 100;


Question: Is that what I have to do or is there a way to make token() and limit 
work together to return complete wide rows?


Jan



[1] token() and how it relates to paging is actually quite hard to grasp from 
the docs.

Reply via email to