2017-08-24 37 views
0

我正在尋找一種將時間特定數據存儲在cassandra中的好方法。在cassandra中存儲時間特定數據

每個條目可以看起來像(start_time, value)。稍後,我想檢索當前值。

檢索當前值的邏輯如下。

  1. 查找與start_time<=current_time的所有行。

  2. 然後從第一步中獲得的行中找到最大值爲start_time的值。

PS: - 編輯的問題,使之更加明確

+0

這是您要執行的一個查詢嗎?列出您想要執行的所有類型的查詢併爲其建模 –

+0

是的,這是我想要執行的唯一查詢。 – Ravi

+0

你需要以前的所有數據嗎? –

回答

0

創建兩個單獨的表象下面這樣:

CREATE TABLE data (
    start_time timestamp, 
    value int, 
    PRIMARY KEY(start_time, value) 
); 

CREATE TABLE current_value (
    partition int PRIMARY KEY, 
    value int 
); 

現在,你必須將數據插入到兩個表,插入數據進入第二個表格使用像1一樣的靜態值。

INSERT INTO current_value(partition, value) VALUES(1, 10); 

現在在當前值表中,您的數據將被置頂,每當您選擇時您將獲得最新值。

+0

如果我輸入未來的時間戳,它會起作用嗎? – Ravi

+0

@Ravi current_value表將保留最後一個插入 –

+0

我認爲在這裏數據表將不允許像start_time <= current_time這樣的查詢。 –

1

確切的要求是不可能的。但是我們可以用更多的專欄來貼近它。

首先,爲了能夠使用<=運算符,您的start_time列需要是表的集羣鍵。

然後,你需要一個不同的分區鍵。您可以選擇一個固定值,但當分區的行數太多時可能會帶來問題。那麼你應該更好地使用諸如start_time的年份或月份。

CREATE TABLE time_specific_table (
    year bigint, 
    start_time timestamp, 
    value text, 
    PRIMARY KEY((year), start_time) 
) WITH CLUSTERING ORDER BY (start_time DESC); 

的問題是,當你將查詢表,你需要知道分區鍵的值:

找到所有行與START_TIME < = CURRENT_TIME

SELECT * FROM time_specific_table 
WHERE year = :year AND start_time <= :time; 

選擇最大值start_time

SELECT * FROM time_specific_table 
WHERE year = :year LIMIT 1; 
+0

'SELECT * FROM time_specific_table WHERE year =:year;'這部分對我來說不是很清楚。它如何給我最大的start_time? – Ravi

+0

我提到的查詢不是獨立的。編輯該問題以使其更加清晰。謝謝。 – Ravi

+0

@Ravi感謝'start_time'列上的'DESC'' CLUSTERING ORDER',您將通過此查詢獲得最高的'start_time'值。 –

相關問題