我是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:我需要在阅读时尽可能快地完成
答案 0 :(得分:2)
我有一个传感器,每毫秒收集一个值,我必须将这些数据存储在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和day上进行分区,同时按时间戳对分区内的行进行排序。所以你可以查询:
> 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中建模的方法是为每个查询模式设置一个表。因此,您希望对值进行查询范围的第二个表可能如下所示:
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