2016-11-02 53 views
5

在我的ETL作業期間,我正在考慮將Cassandra作爲中間存儲來執行重複數據刪除。獲取Cassandra中每個分區鍵的第一行

讓我們想象一下,我有一系列事件,每個事件都有一些業務實體ID,時間戳和一些值。我只需要根據每個業務密鑰的事件時間戳獲取最新值,但事件可能無序。

我的想法是與業務ID創建臨時表的分區鍵和時間戳作爲聚集關鍵字:

CREATE TABLE sample_keyspace.table1_copy1 (
id uuid, 
time timestamp, 
value text, 
PRIMARY KEY (id, time) 
) WITH CLUSTERING ORDER BY (time DESC) 

現在,如果我插入此表中的一些數據,我可以爲某些給定分區獲取最新值鍵:

select * from table1 where id = 96b29b4b-b60b-4be9-9fa3-efa903511f2d limit 1; 

但這需要爲每一個企業的關鍵我很感興趣,發出這樣的查詢

有沒有我可以做一些有效的方法它在CQL中?

我知道我們有能力列出所有可用的分區鍵(由select distinct id from table1)。因此,如果我研究Cassandra的存儲模型,爲每個分區鍵獲取第一行應該不會太難。

是否支持?

回答

13

如果您使用的是3.6以後的版本,則在查詢中有一個選項PER PARTITION LIMITCASSANDRA-7017),您可以將其設置爲1。這將不會在cqlsh之前自動完成,直到3.10與CASSANDRA-12803

SELECT * FROM table1 PER PARTITION LIMIT 1; 
0

總之:沒有。

分區鍵是爲什麼Cassandra基本上可以處理任何數量的數據:它決定使用分區鍵的散列來放置/查找數據的位置。這就是爲什麼CQL SELECT始終需要在整個分區鍵上執行相等過濾器的原因。爲了找到第一個time爲每個id,卡桑德拉將不得不要求所有節點的數據的任何分區,然後然後執行每個他們的複雜操作。關係數據庫允許這樣做,Cassandra不會。它允許的全部表掃描(SELECT * from table1)或分區掃描(SELECT DISTINCT id FROM table1),但這些掃描不能*鏈接到任何複雜的操作。

*)這裏省略了ALLOW FILTERING,因爲它在這方面沒有幫助。

相關問題