传感器数据的 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
我是 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