2016-11-02 62 views
0

我有一個表的Foo與4列A,B,C,D的分區鍵是A.聚類密鑰B,C,D。刪除大量的行從一個非常大的卡桑德拉表

我想要掃描整個表並找到D處於設置位置(X,Y,Z)的所有行。

然後我想要刪除這些行,但我不想「殺死」Cassandra(因爲壓縮),我希望這些行被刪除的時間最短,風險最小。

我該怎麼做?

+1

可能要檢查https://www.youtube.com/watch?v=BhGkSnBZgJA刪除壓縮策略,而不是C * OSS的一部分,但可以解決問題,而不需要所有的讀取。 https://github.com/protectwise/cassandra-util/tree/master/deleting-compaction-strategy –

回答

2

這裏有個大問題。事實上,如果沒有實際掃描所有分區,您確實無法找到行。問題的真正問題是C *將允許您使用分區鍵來限制您的查詢,然後按您的集羣鍵在您的PRIMARY KEY表聲明中出現的順序進行限制。所以,如果你的PK是這樣的:

PRIMARY KEY (A, B, C, D) 

那麼你需要通過第一隻由D.

年底

如此說來過濾,然後用B,C,並且對於的部分找到你行,如果這是你必須只運行一次的東西,你

  1. 可以掃描所有的表格,並做d的比較,在你的應用程序邏輯。
  2. 如果您知道A的值,您可以並行查詢每個分區,然後在您的應用程序中比較D
  3. 您可以附加二級索引並嘗試從那裏利用速度。

請注意,這取決於有多少節點,你有3個是真的不是一個選項,二級指標不比例)

如果需要執行這樣的任務多次,我建議你要創建另一個表來滿足這個查詢,如PRIMARY KEY (D),那麼您只需掃描三個分區,這將非常快。

關於刪除你的行,我認爲沒有觸發壓縮的辦法,它們是C *的一部分,你必須和它們一起生活。如果您真的無法容忍邏輯刪除的創建和/或壓縮,唯一的選擇是而不是從C *集羣刪除行,這通常意味着考慮不需要刪除的新數據模型。

+0

我不必多次這樣做。這是一次性清理的一部分。對我來說,更適合創建另一個表格,然後將過濾的數據移動到那裏並刪除原始表格。我從我的管理員那裏聽說,「太多」的墓碑創作對他們來說是非常有問題的。 –

+0

然後,您應該利用這種情況,並通過創建多個適合滿足所有您需要執行的查詢的表來非規範化所有數據。這將是一個巨大的勝利。 – xmas79