从cassandra获取特定数量的时间序列数据

nuypyhwy  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(404)

显然,当处理与某些自然分区键(如传感器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有办法吗?推荐的方法是什么?

chy5wohz

chy5wohz1#

保留一张一年/一天的第二张表。当阅读可以从中抢占先机。当添加到我的\u数据时,也会更新它,但要保留插入天数的缓存,以便每个应用程序每天只尝试插入一次。例如,添加额外的键,使每个时间序列可以有多个流而不仅仅是一个表:

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个事件。如果数据稀疏,那么可能会浪费大量的读取,而另一个表工作得更好。

相关问题