我想检索一个单元格的所有版本。但是,似乎Cassandra API只能获得最新版本/时间戳。例如使用hector:
import me.prettyprint.hector.api._
import me.prettyprint.hector.api.factory._
import me.prettyprint.cassandra.serializers._
import me.prettyprint.cassandra.service.template._
object GetExample extends App {
val cluster = HFactory.getOrCreateCluster("test_cluster", "127.0.0.1:9160")
val keyspace = HFactory.createKeyspace("test_keyspace", cluster)
val colFamilyName = "test_table"
val template = new ThriftColumnFamilyTemplate(keyspace, colFamilyName,
StringSerializer.get(),
StringSerializer.get())
val result = template.queryColumns("row1")
System.out.println(result.getString("qual1"))
System.out.println(result.getColumn("qual1").getClock())
HFactory.shutdownCluster(cluster)
}
getClock()
只给了我最新的时间戳。
我想要所有时间戳的一个原因是,在Cassandra自己的API中,删除可以指定一个时间戳来删除早于此值的值。那么,如果我不能在第一时间检索它们,我怎么想知道要使用哪个时间戳呢?此外,我可能想使用时间戳来存储一个单元格的不同版本,作为一个非常有用的建模机制。
Cassandra能做到吗?
我搜索了一下,发现Jonathan Ellis曾说过:“不,我们不打算增加对检索旧版本的支持。”但它是2010年3月。它仍然是真的吗?如果是,为什么?
答案 0 :(得分:3)
列具有时间戳的原因是,当多个客户端写入同一列时,Cassandra可以处理冲突解决。
如果要保留多个版本的列,可以使用 OriginalColumnName :: TimeUUID 的复合列。然后,您可以通过OriginalColumnName切出所有列以获取该列的历史值。以下是using hector and composite columns的示例。
答案 1 :(得分:2)
我担心,Cassandra不能这样做。
Acunu的Cassandra版本(http://www.acunu.com/acunu-data-platform/)能够拍摄快照并从中读取(旧)数据。您甚至可以从快照分支并拥有完整的版本树,其中对不同版本的写入完全隔离。
注意:我为Acunu工作。