2016-05-13 37 views
0

我正在使用Datastax驅動程序將一些csv文件轉換爲SSTable。然後我使用sstableloader命令將它推入cassandra。我觀察到的行爲我很努力去解釋,這裏是第一批量導入後的數據庫:Cassandra在多個相同批量導入期間的行爲

sentence_id | text 
-------------+-------- 
      5 | fffff 
      1 | bbbbb 
      8 | iiiii 
      0 | aaaaa 
      2 | ccccc 
      4 | eeeee 
      7 | hhhhh 
      6 | ggggg 
      3 | ddddd 

我然後把一些新的數據到我的表,覆蓋一行:

session.execute("insert into sentences (sentence_id, text) values (%s, %s)", (100, "hehehe")) 
session.execute("insert into sentences (sentence_id, text) values (%s, %s)", (1, "hehehe")) 

這裏現在表:

sentence_id | text 
-------------+-------- 
      5 | fffff 
      1 | hehehe 
      8 | iiiii 
      0 | aaaaa 
      2 | ccccc 
      4 | eeeee 
      7 | hhhhh 
     100 | hehehe 
      6 | ggggg 
      3 | ddddd 

現在,如果我做一個新的批量導入,我希望的sentence_id 1行改變,但沒有發生。爲了更換數據,我需要在導入之前重新生成SSTable。

對發生了什麼有所瞭解?

回答

1

sstable加載程序將採用sstable中的數據並將其原樣傳輸到副本。

[1, bbbbb]單元最初是用插入時間戳的時間戳寫入的。這個時間戳包含在使用sstableloader傳輸時。

當您將[ 1, hehehe]單元格插入memtable(或其他刷新的sstable)時,其時間戳爲「now」。

當你做一個SELECT它會合並這些單元格,並且因爲有衝突,它將使用最近插入的那個(最後寫入勝利)。最終,當數據壓縮時,[1, bbbbb]單元格將不會被複制並且將不復存在。