2012-01-18 80 views
13

下面是我正面临的场景示例。说我有此列族:使用Hector查询Cassandra中的CompositeType列

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

下面是使用赫克托,我怎么会去一些数据插入到该列家族的一些示例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<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get()); 
Mutator<String> addInsertion = mutator.addInsertion("rowkey1", "CompositeTypeCF", 
    HFactory.createColumn(colKey1, "Some Data", new CompositeSerializer(), StringSerializer.get())); 
mutator.execute(); 

这工作,如果我去卡桑德拉-CLI和做一个名单,我得到这样的:

$ list CompositeTypeCF; 

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

我现在的问题是:我该如何去有关赫克托查询这些数据?基本上,我需要查询它在几个方面:

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

回答

13

很好的起点教程here内。

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

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

因此,假设为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到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列之间的所有结果。 复合搜索条件不要给出的结果好像处理嵌套循环(这是我原本认为的),而是由于列是排序的,因此您要指定连续的块的开始和结束条件列

当建立综合的搜索条目,你必须指定ComponentEquality

只有最后期限应该是GREATER_THAN_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<String, Composite, String> sliceQuery = HFactory.createSliceQuery(keyspace, se, ce, se); 
sliceQuery.setColumnFamily("CF").setKey(myKey); 
ColumnSliceIterator<String, Composite, String> csIterator = new ColumnSliceIterator<String, Composite, String>(sliceQuery, start, end, false); 

while (csIterator.hasNext()) .... 
+1

您能详细说明为什么我们需要在最后一个组件中使用GREATER_THAN_EQUAL吗?我阅读了文章,但事情仍不清楚。 – 2012-07-17 06:19:31

+0

我已经问过这个问题了,所以我可以奖励你的积分! – 2012-07-17 06:32:16

+0

我不知道,我尝试了一些示例代码来说服自己,它适用于我所需要的。 – libjack 2012-07-18 18:40:41