以下是我面临的情景示例。说我有这个专栏系列:
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<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();
这很有效,如果我去cassandra-cli做一个清单,我就明白了:
$ list CompositeTypeCF;
Using default limit of 100
-------------------
RowKey: rowkey1
=> (column=1:test1, value=Some Data, timestamp=1326916937547000)
我现在的问题是:如何在Hector中查询这些数据?基本上我需要以几种方式查询它:
答案 0 :(得分:13)
良好的起点教程here。
但是,在最终需要使用复合组件并尝试针对数据编写查询之后,我想出了一些我想要分享的内容。
搜索复合列时,结果将是一个连续的列块。
所以,假设一个由三个字符串组成的复合词,我的列看起来像:
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列之间的所有结果。 复合搜索字词不给出结果,好像处理嵌套循环一样(这是我原来的想法),而是,因为列是排序的,你指定连续的列块的开始和结束术语。
构建复合搜索条目时,必须指定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<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()) ....