如何通过主键集中仅按一列来汇总 cassandra 计数器分组?



我正在尝试跟踪在一小时时间段内发生的每种类型的事件数量,然后在任意时间范围内对每个类别的计数求和。 因此,我创建了一个这样的表:

CREATE TABLE IF NOT EXISTS sensor_activity_stats(
sensor_id text,
datetime_hour_bucket timestamp,
activity_type text,
activity_count counter,
PRIMARY KEY ((sensor_id), datetime_hour_bucket, activity_type)
)
WITH CLUSTERING ORDER BY(datetime_hour_bucket DESC, activity_type ASC);

我希望能够实现这种查询:

SELECT datetime_hour_bucket, activity_type, SUM(activity_count) as count 
FROM sensor_activity_stats
WHERE sensor_id=:sensorId 
AND datetime_hour_bucket >= :fromDate AND datetime_hour_bucket < :untilDate
GROUP BY activity_type

Cassandra抱怨说,因为分组必须按照主键列的顺序进行。而且,如果我更改顺序,我将无法按任何activity_type的范围进行查询。

一些注意事项:

  1. 按小时分组,因为有些用户可能会要求我显示不同时区的数据,我希望能够进行体面的转换。
  2. activity_type的基数较低,但我不能确定我是否总是能够预测它的可能值。

现在,我的解决方案是查询范围内的整个数据,并在代码中自己执行聚合。 您是否遇到过类似的情况,您的解决方案是什么? 您是否建议使用其他方式来查询或排列数据?

我希望你已经找到了问题的解决方案,但是我有办法让你尝试。

首先,您可以更改创建表以更改字段的顺序:

CREATE TABLE IF NOT EXISTS sensor_activity_stats(
sensor_id text,
datetime_hour_bucket timestamp,
activity_type text,
activity_count counter,
PRIMARY KEY (activity_type, sensor_id, datetime_hour_bucket, activity_count)
)
WITH CLUSTERING ORDER BY(activity_type ASC, datetime_hour_bucket DESC);

然后,查询可以在 Group By 子句中添加字段"datetime_hour_bucket":

SELECT datetime_hour_bucket, activity_type, SUM(activity_count) as count 
FROM sensor_activity_stats
WHERE sensor_id=:sensorId 
AND datetime_hour_bucket >= :fromDate AND datetime_hour_bucket < :untilDate
GROUP BY activity_type, datetime_hour_bucket;

最新更新