我使用Datastax驱动程序将一些csv文件转换为SSTable。然后我使用sstableloader
命令将其推入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。
有关正在发生的事情的任何见解?
答案 0 :(得分:1)
sstable loader将获取sstable中的数据并将其完全按原样传输到副本。
[1, bbbbb]
单元格最初写入的时间戳为插入时间。使用sstableloader传输时包含此时间戳。
当您将[ 1, hehehe]
单元格插入memtable(或者如果已刷新其他sstable)时,其时间戳为"现在为#34;。
当你执行SELECT
时,它会合并这些单元格,因为存在冲突,它将使用最近插入的那个(最后写入获胜)。最终,当数据被压缩时,[1, bbbbb]
单元格将不会被复制并且将不复存在。