2013-03-04 83 views
2

我想一些時間序列數據存儲在以下列族:在卡桑德拉更新TimeUUID列

create column family t_data with comparator=TimeUUIDType and default_validation_class=UTF8Type and key_validation_class=UTF8Type; 

我成功地插入數據是這樣的:

data={datetime.datetime(2013, 3, 4, 17, 8, 57, 919671):'VALUE'} 
key='row_id' 
col_fam.insert(key,data) 

,你可以請參閱使用日期時間對象作爲列名pycassa正確轉換爲timeUUID對象。

[[email protected]] get t_data[row_id]; 

=> (column=f36ad7be-84ed-11e2-af42-ef3ff4aa7c40, value=VALUE, timestamp=1362423749228331) 

有時,應用程序需要更新一些數據。問題是,當我嘗試更新該列,傳遞相同的日期時間對象時,pycassa創建了一個不同的UUID對象(時間部分是相同的),所以不是更新列而是創建另一個UUID對象。

[[email protected]] get t_data[row_id]; 

=> (column=f36ad7be-84ed-11e2-af42-ef3ff4aa7c40, value=VALUE, timestamp=1362423749228331) 

=> (column=**f36ad7be**-84ed-11e2-b2fa-a6d3e28fea13, value=VALUE, timestamp=1362424025433209) 

問題是,我怎樣才能更新基於pycassa傳遞datetime對象的基於TimeUUID的列?或者,如果這不是正確的做法,建議的方法是什麼?

回答

2

除非你做一個讀 - 修改 - 寫你不能。 UUID本質上是獨一無二的。它們的存在是爲了解決如何獲得按時間順序排序的唯一ID的問題,但同時避免發生在同一時間發生的事件的衝突。

因此,要更新該列,您需要先閱讀該列,以便找到其列鍵,更改其值並將其重新寫回。

這不是一個特別優雅的解決方案。您應該避免在Cassandra中進行讀取 - 修改 - 寫入。也許TimeUUID不適合你的列鍵?或者,您可以通過另一種方式設計應用程序,以避免返回並更改內容。

不知道你的查詢模式是什麼樣子,我不能說你應該怎麼做,而不是,但這裏有一些建議,希望相關:

不更新值,只寫新值。如果T時刻的事情是真的,那麼即使它在時間T + 1時變化,對於T時刻也是如此。當事物發生變化時,你隨着變化的時間寫出一個新值,並讓舊值變爲。當你閱讀時間線時,通過選取最近的值來解決這些衝突 - 由於這些值將按時間順序排序,所以最近的值將始終是最後一個值。這與Cassandra在內部做事非常相似,而且是一個非常強大的模式。

不要擔心這會佔用更多的磁盤空間,或者在讀取時間序列時需要一些額外的CPU,與讀取 - 修改 - 寫入複雜性相比,它很可能很小,否則您將不得不實行。

可能有其他方法可以解決你的問題,如果你給我們更多的細節,也許我們可以想出更適合你的問題。

+0

謝謝你的回答。應用程序設計意味着有些時候,與行關聯的值不是正確的,兒子更新它們是很有必要的,但是你的迴應澄清了我要遵循的路徑。謝謝。 – jcazor 2013-03-05 11:08:14