从Cassandra

时间:2018-09-20 17:58:31

标签: cassandra time-series

很显然,当处理与某些自然分区键(例如传感器ID)相关的时间序列数据时,它可以用作主键。但是,如果我们对全局视图感兴趣并且没有自然的分区键候选者该怎么办?如果我们像这样对模式建模:

CREATE TABLE my_data(
 year smallint,
 day smallint,
 date timestamp,
 value text
 PRIMARY KEY ((year, day), timestamp)
) WITH CLUSTERING ORDER BY (date DESC);

(可能)在大多数情况下都可以正常工作,但是鉴于我们知道要提取的年份和日期。

如果我们不在乎今天是什么日子,但我们希望看到前50个最新物品怎么办?如果我们接下来要看下50个项目怎么办?卡桑德拉(Cassandra)有办法吗?建议这样做的方法是什么?

1 个答案:

答案 0 :(得分:1)

保留年/日的第二张表。阅读时可以先抓住它。当添加到my_data时,也会进行更新,但要保留插入天的缓存,因此每个应用程序每天只能尝试插入一次。例如,添加额外的键,以便每个时间序列可以有多个流,而不仅仅是一个表:

CREATE TABLE my_data (
  key blob,
  year smallint,
  day smallint,
  date timestamp,
  value text
  PRIMARY KEY ((key, year, day), timestamp)
) WITH CLUSTERING ORDER BY (date DESC);

CREATE TABLE my_data_keys (
   key blob,
   year smallint,
   day smallint,
   PRIMARY KEY ((key), year, day)
)

对于插入物:

INSERT INTO my_data_keys (key, year, day) VALUES (0x01, 1, 2)
INSERT INTO my_data ...

然后在内存中设置一个存储键/年/数据的位置,这样就不必每次都插入它。要阅读最新内容:

SELECT year, day FROM my_data_keys WHERE key = 0x01; 

驱动程序返回迭代器,对其中的每个元素进行查询,直到达到50条记录为止。

如果插入足够频繁,则可以从“今天”开始倒退,发出查询直到获得50个事件。如果数据稀疏,则可能会浪费大量的读取数据,而另一个表的性能会更好。