2016-03-09 24 views
1

我有數百萬條記錄,現在我必須獲取最新的最新記錄。我想用record_id保存每條記錄,並且我希望record_id在插入新記錄時自動遞增。如何在cassandra中像SQL一樣設置自動增量ID(整數)?

例如:假設我有1000條記錄,首先我需要最新的100條記錄,從901到1000.現在,第二個請求中,我需要從801到900的下一個100條記錄。我已經經歷了很多鏈接但沒有發現任何相關的東西。任何機構能否提供適當的解決方案?

讓我們假設EMP表包含:
名文字,
RECORD_ID INT,
地址文本

假設名字是主鍵,RECORD_ID是集羣的關鍵。但請不要現在討論主鍵概念,因爲我的要求是將id創建爲集羣鍵(我使用的是cassandra 2.2.3和cql 3.3.1)。

回答

2

自動遞增ID在Cassandra或任何其他分佈式數據庫中並不真正有效。

爲什麼?假設你有三個節點。兩個節點同時獲得對同一個表的寫入請求。一個檢查表的最大ID,並得到一個(示例)響應2544.在可以寫入新行之前,另一個節點執行相同的過程,並獲得2544.現在,您有兩行被插入2545,在卡桑德拉,最後的寫作「勝利」,所以你會失去第一次寫作。

因此,這也是爲什麼先前讀寫方法被認爲是Cassandra中的反模式。正如Stefan所建議的那樣,TimeUUID提供瞭解決這個問題的方法。

在卡桑德拉你需要設計你的表來適應你的查詢模式。我聽到的是,你想要找回最近100名更新的員工。我想創建一個特定的表來服務於:

CREATE TABLE employee_updates (
    datebucket text, 
    record_id timeuuid, 
    name text, 
    address text, 
    PRIMARY KEY (datebucket,record_id)) 
WITH CLUSTERING ORDER BY (record_id DESC); 

現在,當你查詢該表的最後100條記錄:

SELECT * FROM employee_udpates WHERE datebucket='20160309' LIMIT 100; 

你可以得到最近期的100條記錄,那一天。注意:如果「日」對您的解決方案來說太細緻(只有少數員工記錄每天都會更新),請隨時將其擴大到更適用的範圍。

UPDATE:

如果我想以前的最新的100的記錄是801到900

這種解決方案實際上確實有辦法通過的結果, 「頁」。

讓我們插入一些行到表:

> INSERT INTO employee_updates (datebucket, record_id , address , name) VALUES ('20160309',now(),'123 main st.','Bob Kerman'); 
> INSERT INTO employee_updates (datebucket, record_id , address , name) VALUES ('20160309',now(),'456 Gene ave.','Bill Kerman'); 
> INSERT INTO employee_updates (datebucket, record_id , address , name) VALUES ('20160309',now(),'34534 Water st.','Jebediah Kerman'); 
> INSERT INTO employee_updates (datebucket, record_id , address , name) VALUES ('20160309',now(),'843 Rocket dr.','Valentina Kerman'); 
> INSERT INTO employee_updates (datebucket, record_id , address , name) VALUES ('20160309',now(),'33476 Booster way','Isabella Kerman'); 
> INSERT INTO employee_updates (datebucket, record_id , address , name) VALUES ('20160309',now(),'43 Solid Rocket pl.','Helcine Kerman'); 

現在讓我選擇的前3名最近期的今天:

> SELECT datebucket, record_id, dateof(record_id), name 
    FROm employee_updates WHERE datebucket='20160309' LIMIT 3; 

datebucket | record_id       | system.dateof(record_id) | name 
------------+--------------------------------------+--------------------------+------------------ 
    20160309 | 511f9150-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:43:02+0000 | Helcine Kerman 
    20160309 | 2f9f3670-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:42:06+0000 | Isabella Kerman 
    20160309 | 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:46+0000 | Valentina Kerman 

(3 rows) 

正如我在降序排列都聚集在record_id此表,我可以簡單地通過查詢record_id來獲得接下來的3條記錄,比我讀的最後一條還要少。在這種情況下,這會是23b0dc60-e5db-11e5-a4ba-a52893cc9f36

> SELECT datebucket, record_id, dateof(record_id), name 
    FROm employee_updates WHERE datebucket='20160309' 
    AND record_id < 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 LIMIT 3; 

datebucket | record_id       | system.dateof(record_id) | name 
------------+--------------------------------------+--------------------------+----------------- 
    20160309 | 16400100-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:23+0000 | Jebediah Kerman 
    20160309 | 0b239cf0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:05+0000 |  Bill Kerman 
    20160309 | 00d648b0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:40:47+0000 |  Bob Kerman 

(3 rows) 
+0

謝謝@Aaron,我得到了你的觀點,如果我想以前的最新的100條記錄什麼。 (就像我有1000條記錄,現在我得到了最新的100條記錄,因爲你說的是​​901到1000,如果我想要以前的最新的100條記錄是801到900),我想爲每個請求分配100條記錄,任何人都可以請建議根據我的要求查詢... – Ankit

+0

@Ankit編輯。 – Aaron

1

Cassandra不支持自動增量ID。但是,您可以使用time-based UUID來代替集羣密鑰,以確保記錄將從最舊到最新排序。

相關問題