我希望尽可能高效地存储大量的时间序列。速度很重要,但不如存储重要。
我的数据包括股票的名称,然后是15分钟的1分钟数据。 数据在2000年1月1日开始准备,每天的分钟数恰好是390。
所以我不需要存储每个系列的timeStamp,因为我可以自动计算。
所以不要这样:
Apple [timeStamp:value][timeStamp:value]
我想要这个:
Apple [value][value]
有没有办法在Cassandra中加载这种数据,因此它只存储顺序值,而不是每个值的时间戳。
据推测,通过为每个系列使用时间戳,它会使所需的存储量增加一倍:如果每个时间戳和值为8个字节,如果仅存储该值,则将占用50太字节而不是25太字节。
答案 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扩展回原始值数组。