传感器数据的 Cassandra 数据模型 - 价值 |时间戳

Cassandra Data Model for Sensor Data - Value | Timestamp

我是 Cassandra 的新手,我正在尝试定义一个符合我要求的数据模型。

我有一个传感器,每毫秒收集一个值,我必须将这些数据存储在 Cassandra 中。我要执行的查询是:

1) 给我从 - 到这些时间戳值的所有传感器值

2) 告诉我这个值范围是什么时候记录的

我不确定是否存在可以满足这两个查询的通用模式,因为我想对这两个值执行范围查询。对于第一个查询,我应该使用类似的东西:

CREATE TABLE foo (
value text,
timestamp timestamp,
PRIMARY KEY (value, timestamp));

但是对于第二个查询,我需要相反的方法,因为如果不使用限制时间戳的令牌,我就无法对分区键进行范围查询:

CREATE TABLE foo (
value text,
timestamp timestamp,
PRIMARY KEY (timestamp, value));

我需要两张桌子吗?还是存在另一种方式? 谢谢

PS: 我需要在阅读时尽可能快

I have a sensor that collects one value every millisecond and I have to store those data in Cassandra.

我在这里看到的主要问题是,您将很快 运行 进入 Cassandra 的每个分区 20 亿个 col 值的限制。 DataStax 的 Patrick McFadin 有一个很好的气象站数据示例 (Getting Started with Time Series Data Modeling),似乎适合这里。如果我将它应用到你的模型,它看起来像这样:

CREATE TABLE fooByTime (
    sensor_id text,
    day text,
    timestamp timestamp,
    value text,
PRIMARY KEY ((sensor_id,day),timestamp)
);

这将在 sensor_id 和日期进行分区,同时按时间戳对分区内的行进行排序。所以你可以这样查询:

> SELECT * FROM fooByTime WHERE sensor_id='5' AND day='20151002' 
  AND timestamp > '2015-10-02 00:00:00' AND timestamp < '2015-10-02 19:00:00';

 sensor_id | day      | timestamp                | value
-----------+----------+--------------------------+-------
         5 | 20151002 | 2015-10-02 13:39:22-0500 |    24
         5 | 20151002 | 2015-10-02 13:49:22-0500 |    23

是的,在 Cassandra 中建模的方法是为每个查询模式设置一个 table。因此,您想要对值进行范围查询的第二个 table 可能看起来像这样:

CREATE TABLE fooByValues (
    sensor_id text,
    day text,
    timestamp timestamp,
    value text,
PRIMARY KEY ((sensor_id,day),value)
);

这将支持如下查询:

> SELECT * FROm foobyvalues WHERE sensor_id='5' 
  AND day='20151002' AND value > '20' AND value < '25';

 sensor_id | day      | value | timestamp
-----------+----------+-------+--------------------------
         5 | 20151002 |    22 | 2015-10-02 14:49:22-0500
         5 | 20151002 |    23 | 2015-10-02 13:49:22-0500
         5 | 20151002 |    24 | 2015-10-02 13:39:22-0500