如何为列族定义复合键,然后使用Hector引用它?

时间:2011-09-07 05:24:27

标签: cassandra composite-key hector

我在哪里可以找到样品?

我的大部分代码都使用ColumnFamilyTemplate对数据记录进行CRUD,见下文。一旦定义了复合键,我是否仍然可以使用ColumnFamilyTemplate来访问具有复合键的数据?

private static final ColumnFamilyTemplate<UUID, String> template = 
    new ThriftColumnFamilyTemplate<UUID, String>(
        Bootstrap.keyspace, 
        "User", 
        UUIDSerializer.get(), 
        StringSerializer.get(),
        HFactory.createMutator(Bootstrap.keyspace, UUIDSerializer.get()));

2 个答案:

答案 0 :(得分:3)

用于在记录上执行CRUD的API应该无关紧要; CompositeType(或DynamicCompositeType)只是另一种类型(例如类似于UUID),它具有相应的序列化器(CompositeSerializer)。所以,你的例子可能会成为:

private static final ColumnFamilyTemplate<Composite, String> template = 
new ThriftColumnFamilyTemplate<Composite, String>(
    Bootstrap.keyspace, 
    "User", 
    CompositeSerializer.get(), 
    StringSerializer.get(),
    HFactory.createMutator(Bootstrap.keyspace, CompositeSerializer.get()));

在使用模板之前只需要额外创建Composite(假设UUID和Long的复合):

Composite key = new Composite();
key.addComponent(someUUID, UUIDSerializer.get());
key.addComponent(someLong, LongSerializer,get());
ColumnFamilyResult<Composite,String> result = template.queryColumns(key);

获取结果时,获取密钥组件的一种方法是:

myUUID = result.getKey().get(0, UUIDSerializer.get());
myLong = result.getKey().get(1, LongSerializer,get());

答案 1 :(得分:1)

如果定义复合键,还需要告诉Cassandra(> 0.8.1)使用CompositeType作为比较器。以下是从定义CompositeType架构到编写范围查询的完整示例: http://randomizedsort.blogspot.com/2011/11/cassandra-range-query-using.html