2015-04-16 31 views
1

我希望儘可能高效地存儲大量的時間序列。速度很重要,但不如存儲重要。在cassandra中存儲TB的統一時間序列

我的數據包含股票的名稱,後面跟着15分鐘的1分鐘數據。 數據開始精確於2000年1月1日,每天的分鐘數恰好爲390.

所以我不需要存儲每個系列的時間戳,因爲我可以自動計算。
因此,而不是這樣的:

Apple [timeStamp:value][timeStamp:value] 

我想這一點:

Apple [value][value]

有沒有辦法所以只存儲連續值加載這種在卡桑德拉的數據,而不是每個值的時間戳。

推測,通過使用每個系列的時間戳,它會使所需的存儲空間增加一倍:如果每個時間戳和值都是8個字節,那麼如果僅存儲值,則佔用50TB而不是25TB。

回答

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擴展回原始數組值。