我正在尝试跟踪在一小时时间段内发生的每种类型的事件数量,然后在任意时间范围内对每个类别的计数求和。 因此,我创建了一个这样的表:
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的范围进行查询。
一些注意事项:
我- 按小时分组,因为有些用户可能会要求我显示不同时区的数据,我希望能够进行体面的转换。
- 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;