【问题标题】:Cassandra for timeseries with multiple types of measurementsCassandra 用于具有多种测量类型的时间序列
【发布时间】:2014-12-11 08:19:11
【问题描述】:

我刚刚开始使用 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)
);

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

【问题讨论】:

    标签: database cassandra time-series cassandra-2.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 的一项新功能。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 2015-10-26
      • 2017-09-15
      • 2019-08-05
      • 2016-11-08
      • 2018-09-24
      • 2012-08-17
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多