database - 用于具有多种测量类型的时间序列的 Cassandra

标签 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)
);

我理解当只有一种测量类型时它是如何工作的——在这种情况下是温度。但是如果我们也有压力测量呢?在这种情况下,表的结构是什么?时间戳的列是否拆分以存储温度和压力,或者是否创建了两列?如果有两列是否对拼接查询等性能有影响?

最佳答案

在 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)
);

然后您可以获得一行中某个时间戳的所有读数。这确实意味着您不能简单地过滤到特定类型的读数(即您获得一行的所有读数),尽管您可以在 map 的键上添加一个索引,以便您进行过滤。查看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 的新功能。

希望对您有所帮助。

关于database - 用于具有多种测量类型的时间序列的 Cassandra,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26396381/

相关文章:

sql - 计算没有 COUNT 的元组数。是否可以?

cassandra - 如何在 Cassandra 中使用 Apache Drill

sql - 通过填充前移/LOCF 在 SQL 中的一系列连续行上插补一列?

MySQL更新查询

database - pick/UniVerse 数据库中的常量

sql - 如何按照用户的期望排序和显示字母和数字的混合列表?

java - 获取所有行中最近添加的列?

cassandra - 如何在 Pig 中过滤 Cassandra TimeUUID/UUID

r - 使用 tidyverse 对大型时间序列数据集有条件聚合列

mongodb - 无法对时间序列集合执行非多重更新