问题描述
好的起点教程在这里。
但是,在最终需要使用复合组件并尝试针对数据编写查询之后,我想出了一些我想共享的东西。
因此,假设由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搜索项 像处理嵌套循环那样提供结果(这是我最初的想法),而是 由于对列进行了排序,因此您要为连续的column块指定开始项和结束项 。
仅最后一项应为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()) ....
解决方法
这是我面临的场景的一个示例。说我有这个专栏家庭:
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)
我现在的问题是:如何在赫克托尔中查询该数据?基本上,我需要以几种方式查询它:
- 给我整行,其中行键=“ rowkey1”
- 给我列数据,其中列名的第一部分=一些整数值
- 给我所有列名称的第一部分在一定范围内的列