Cassandra用于多种测量的时间序列

时间:2014-10-16 04:46:37

标签: database cassandra time-series cassandra-2.0

我刚开始使用Cassandra存储一些时间序列数据,我正在按照http://planetcassandra.org/getting-started-with-time-series-data-modeling/

的教程进行操作
CREATE TABLE temperature (
weatherstation_id text,
event_time timestamp,
temperature text,
PRIMARY KEY (weatherstation_id,event_time)
);

我知道在单一类型的测量时它是如何工作的 - 在这种情况下是温度。但是,如果我们也有压力测量怎么办?在这种情况下,表的结构是什么?时间戳的列是否已分割为存储温度和压力,还是创建了两列?如果有两列是拼接查询的性能,例如,受影响?

1 个答案:

答案 0 :(得分:1)

在cassandra中,最有效的查询命中一个分区,然后使用列键查找列。主键中的第一个键是分区键,所有后续键都是列键。列键的顺序很重要。您可以从"从左到右指定列密钥" ...即。你只能指定分区键,或分区键+第一列键,或分区键+第一列键+第二列键....但你不能指定分区键+第二列键(不是没有)二级索引,但我现在就把它留下来)。因此,cassandra中的模式很大程度上取决于您的查询要求。如果您知道您将始终按类型查询(如温度读数,压力读数,或其他一些读数,或类型的组合),则以下模式可以起作用:

CREATE TABLE readings (weatherstation_id text,
event_type text,
event_time timestamp,
reading_value text,
PRIMARY KEY (weatherstation_id, event_type, event_time)
);

然后你可以使用类似的东西:

SELECT * FROM readings where weatherstation_id = '12' and event_type='temperature'....

每次阅读会创建一行。

另一种选择是每行有多个读数。在这种情况下,架构可能如下所示:

CREATE TABLE readings (weatherstation_id text,
event_time timestamp,
readings map<string, string>,
PRIMARY KEY (weatherstation_id, event_time)
);

然后你可以获得一行中时间戳的所有读数。这意味着你不能简单地过滤到特定类型的阅读(即你得到一行的所有读数),虽然你可以在地图的键上添加一个索引,让你过滤。查看http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/create_index_r.html?scroll=reference_ds_eqm_nmd_xj__CreatIdxCollKey了解更多详情。请注意,键上的索引是Cassandra 2.1的新功能。

希望有所帮助。