【发布时间】:2014-06-20 01:59:26
【问题描述】:
在基于传感器的应用程序中,每小时根据多达 30 个指标监控多达 30 万个对象,每个指标都有成功和失败计数器。
我的架构:
CREATE TABLE measurements(
objId int,
hour timestamp,
metric text,
succ int,
fail int,
PRIMARY KEY (objId, hour, metric));
数据保留期在 1 年内,这样表格将有 300k 行,每行有 24*360*30*2 列(单元格)。
通常的查询是获取在指定时间间隔(可能是几天、几周、几个月)和指定对象(范围从 1 到数百)内聚合的计数器值。
时间切片与列切片完全没问题,但检索多个对象有点麻烦,因为每个对象的行都由 objId 进行键控,这会导致多重获取。
我能想到的一般查询是:
select * from measurements where objId in (id1, id2, id3...idn) and hour >= <startTime> and hour < <endTime>;
当然,聚合必须在应用程序中手动完成。
问:在给定查询模式的情况下,这是构造数据的最佳方式吗?
最坏的情况是在一段时间内获得“整体”结果,这意味着将所有对象都考虑在内。从我的角度来看,这意味着全表扫描。有什么推荐的做法可以在不使用 MapReduce 的情况下执行此类任务?
【问题讨论】: