我可以在cassandra中阅读一个单元格的所有版本吗?

时间:2012-01-03 10:44:45

标签: java scala cassandra

我想检索一个单元格的所有版本。但是,似乎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月。它仍然是真的吗?如果是,为什么?

2 个答案:

答案 0 :(得分:3)

列具有时间戳的原因是,当多个客户端写入同一列时,Cassandra可以处理冲突解决。

如果要保留多个版本的列,可以使用 OriginalColumnName :: TimeUUID 的复合列。然后,您可以通过OriginalColumnName切出所有列以获取该列的历史值。以下是using hector and composite columns的示例。

答案 1 :(得分:2)

我担心,Cassandra不能这样做。

Acunu的Cassandra版本(http://www.acunu.com/acunu-data-platform/)能够拍摄快照并从中读取(旧)数据。您甚至可以从快照分支并拥有完整的版本树,其中对不同版本的写入完全隔离。

注意:我为Acunu工作。