使用Hector在Cassandra中查询CompositeType列

这是我面临的情景样本。 说我有这个专栏系列:

create column family CompositeTypeCF with comparator = 'CompositeType(IntegerType,UTF8Type)' and key_validation_class = 'UTF8Type' and default_validation_class = 'UTF8Type' 

下面是一些使用Hector的示例Java代码,了解如何将一些数据插入此列族:

  Cluster cluster = HFactory.getOrCreateCluster("Test Cluster", "192.168.1.6:9160"); Keyspace keyspaceOperator = HFactory.createKeyspace("CompositeTesting", cluster); Composite colKey1 = new Composite(); colKey1.addComponent(1, IntegerSerializer.get()); colKey1.addComponent("test1", StringSerializer.get()); Mutator mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get()); Mutator addInsertion = mutator.addInsertion("rowkey1", "CompositeTypeCF", HFactory.createColumn(colKey1, "Some Data", new CompositeSerializer(), StringSerializer.get())); mutator.execute(); 

这是有效的,如果我去cassandra-cli做一个列表,我会得到这个:

 $ list CompositeTypeCF; Using default limit of 100 ------------------- RowKey: rowkey1 => (column=1:test1, value=Some Data, timestamp=1326916937547000) 

我现在的问题是:如何在Hector中查询这些数据? 基本上我需要以几种方式查询它:

  1. 给我整行Row Key =“rowkey1”
  2. 给我列数据,其中列名的第一部分=某个整数值
  3. 给我列名称的第一部分在一定范围内的所有列

这里有很好的起点教程。

但是,在最终需要使用复合组件并尝试针对数据编写查询之后,我想出了一些我想要分享的内容。

搜索复合列时,结果将是一个连续的列块。

所以,假设作为3个字符串的组合,我的列看起来像:

 A:A:A A:B:B A:B:C A:C:B B:A:A B:B:A B:B:B C:A:B 

对于从A:A:A到B:B:B的搜索,结果将是

 A:A:A A:B:B A:B:C A:C:B B:A:A B:B:A B:B:B 

注意“C”组件? 开始/结束条款中没有“C”组件! 是什么赋予了? 这些是A:A:A和B:B:B列之间的所有结果。 复合搜索术语不会像处理嵌套循环一样给出结果 (这是我最初的想法),而是由于列已经排序,因此您要为连续的列块指定开始和结束术语

构建Composite搜索条目时,必须指定ComponentEquality

只有最后一个术语应该是GREATER_THAN_EQUAL,所有其他术语应​​该是EQUAL。 例如,对于上述

 Composite start = new Composite(); start.addComponent(0, "A", Composite.ComponentEquality.EQUAL); start.addComponent(1, "A", Composite.ComponentEquality.EQUAL); start.addComponent(2, "A", Composite.ComponentEquality.EQUAL); Composite end = new Composite(); end.addComponent(0, "B", Composite.ComponentEquality.EQUAL); end.addComponent(1, "B", Composite.ComponentEquality.EQUAL); end.addComponent(2, "B", Composite.ComponentEquality.GREATER_THAN_EQUAL); SliceQuery sliceQuery = HFactory.createSliceQuery(keyspace, se, ce, se); sliceQuery.setColumnFamily("CF").setKey(myKey); ColumnSliceIterator csIterator = new ColumnSliceIterator(sliceQuery, start, end, false); while (csIterator.hasNext()) ....