我正在寻求理智,检查我对Cassandra表进行分页的方法。我的用例如下:我需要一个表格,在给定的一天为我提供网站的最后X个访问者,为分析仪表板提供支持。我使用session_id记录访问,并且我有以下表模式:
session_id text,
yyyymmdd test,
bucket int,
timeuuid timeuuid,
primary key((yyyymmdd, bucket), timeuuid)
WITH CLUSTERING ORDER BY (timeuuid DESC)
存储桶用于避免一个节点上的热点。分页: 查询将如下所示:
SELECT session_id FROM recent_visitors WHERE yyyymmdd = ? AND bucket IN (?) LIMIT 1000;
现在,此查询很可能会影响每个节点,因为存储桶编号大于节点数。这个查询是否太贵/有更好的方法吗?另外,我知道对于每个分区,数据都按聚类列排序,但cassandra会对所有分区的结果进行排序吗?换句话说,数据将在每个(yyyymmdd,bucket)组中返回,但是对于组,我是否必须对结果进行排序以进行最终显示?然后,如果我从结果中获得最早的timeuuid,我计划使用以下查询进行分页:
SELECT session_id FROM recent_visitors WHERE yyyymmdd = ? AND bucket IN (?) LIMIT 1000 WHERE timeuuid < previous_oldest_timeuuid;
这是一种理智的方法吗?提前谢谢你的时间。
答案 0 :(得分:1)
有关Cassandra时间序列建模的一些基础知识,请参阅以下文章:
http://planetcassandra.org/blog/getting-started-with-time-series-data-modeling/
您的数据模型看起来很清晰,但我会更改您的阅读查询。你最好不要异步地为不同的桶发送一堆查询,而不是像那样查询它们。
批处理中的结果集将按照每个桶的顺序进行排序,因此您必须将不同的存储桶组合在一起,最好只针对每个查询命中一个服务器,而不是只有一个查询点击多个服务器。