在cassandra存储统一时间序列的TB

时间:2015-04-16 02:40:06

标签: cassandra storage time-series

我希望尽可能高效地存储大量的时间序列。速度很重要,但不如存储重要。

我的数据包括股票的名称,然后是15分钟的1分钟数据。 数据在2000年1月1日开始准备,每天的分钟数恰好是390。

所以我不需要存储每个系列的timeStamp,因为我可以自动计算。
所以不要这样:

Apple [timeStamp:value][timeStamp:value]

我想要这个:

Apple [value][value]

有没有办法在Cassandra中加载这种数据,因此它只存储顺序值,而不是每个值的时间戳。

据推测,通过为每个系列使用时间戳,它会使所需的存储量增加一倍:如果每个时间戳和值为8个字节,如果仅存储该值,则将占用50太字节而不是25太字节。

1 个答案:

答案 0 :(得分:0)

Cassandra具有列表类型,可以存储多达64K的元素。由于15年的时间超过64K分钟,您需要一些辅助密钥才能将其分解为64K或更小的组。

假设您决定在白天(每天1440分钟)存储它,那么您可以像这样定义表格:

CREATE TABLE stock_values_by_day (
  stock_name text,
  year int,
  day_number_within_year int,
  values list<int>,
  PRIMARY KEY (stock_name, year, day_number_within_year) );

因此,股票名称将是分区键,年份和日期编号将是聚类列。

然后,您将在列表字段中存储每天1440个数据点。因此,您不会在时间密钥上占用太多空间,并且您可以每天查询每个库存的数据,也可以在一年内的多天内进行范围查询。

如何将其分解取决于访问数据时所需的粒度级别(例如,每天,每月等)。

另一种方法是将数据存储在blob字段中。在您的应用程序中,您将数据(例如一年的值)编码为二进制blob并以这种方式保存。当你读出它们时,你必须将二进制blob扩展回原始值数组。