Cassandra:这是数据模型的正确架构吗?

时间:2014-06-20 01:59:26

标签: cassandra schema

在基于传感器的应用程序中,每小时最多可监控300,000个对象,最多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>;

当然,聚合必须在应用程序中手动完成。

问:这是在查询模式下构建数据的最佳方法吗?

最糟糕的情况是整体上&#39;结果在一段时间内,这意味着考虑所有对象。从我的角度来看,这意味着全表扫描。任何推荐的练习来执行这样的任务,而不是诉诸MapReduce?

1 个答案:

答案 0 :(得分:0)

如果您知道通常会限制时间子集并且每小时内可能的对象集可能很稀疏,则可以考虑反转索引顺序,以便时间是第一个维度。这样,您将从一组受限制的行中选择列,因此您仍然需要多次获取,但如果查询所有对象很常见,那么行数可能会更小。

如果您通常查询/聚合到不同的时间粒度,您还可以在更高的粒度时间存储重复数据,例如每天,每周,每月等。这可以显着加快查询以获得更大的时间尺度。非正常化是你在卡桑德拉的朋友!

您可以保留两个排序的索引,并根据您执行的查询类型选择索引。