Cassandra 部分组合列的范围查询
我不知道如何使用Astyanax进行所有需要的范围查询。 我试过所解释的,但似乎不起作用 仅供参考,我来自赫克托世界,在那里我把这一切都做得很好,出于我不想解释的原因,我们决定改用Astyanax 我有一个列族,描述如下。请注意“ReversedType”,它允许我们首先获得最新的TimeUUID。这不应该影响其他人,至少对赫克托没有影响:Cassandra 部分组合列的范围查询,cassandra,composite,astyanax,Cassandra,Composite,Astyanax,我不知道如何使用Astyanax进行所有需要的范围查询。 我试过所解释的,但似乎不起作用 仅供参考,我来自赫克托世界,在那里我把这一切都做得很好,出于我不想解释的原因,我们决定改用Astyanax 我有一个列族,描述如下。请注意“ReversedType”,它允许我们首先获得最新的TimeUUID。这不应该影响其他人,至少对赫克托没有影响: ColumnFamily: mycf Key Validation Class: org.apache.cassandra.db.marshal
ColumnFamily: mycf
Key Validation Class: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)
Default column value validator: org.apache.cassandra.db.marshal.UTF8Type
Columns sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType))
以下是它作为Astyanax CF的定义:
public static final CF = new ColumnFamily<Rowkey, Column>(
NAME,
new AnnotatedCompositeSerializer<Rowkey>(Rowkey.class),
new AnnotatedCompositeSerializer<Column>(Column.class),
StringSerializer.get()
);
public static class Column {
@Component(ordinal = 0)
public String colname = null;
@Component(ordinal = 1)
public UUID timeUUID = null;
}
public static class Rowkey {
@Component(ordinal = 0)
public String aid;
@Component(ordinal = 1)
public String cid;
}
以下是我尝试过的三种方法:
# Code 1
keyspace.prepareQuery(columnFamily)
.getKey(rowkey)
.withColumnRange(columnStart, columnEnd, false, 10)
.execute()
.getResult();
# Code 2
RangeBuilder rangeBuilder = new RangeBuilder()
.setStart(columnStart, CF.getColumnSerializer())
.setEnd(columnEnd, CF.getColumnSerializer())
.setReversed(false)
.setLimit(10);
keyspace.prepareQuery(columnFamily)
.getKey(rowkey)
.withColumnRange(rangeBuilder.build())
.execute()
.getResult();
# Code 3
CompositeRangeBuilder rangeBuilder = ((AnnotatedCompositeSerializer<Column>) colSerializer)
.buildRange()
.withPrefix(columnStart.colname)
.greaterThanEquals(columnStart.timeUUID)
.lessThanEquals(columnEnd.timeUUID)
.limit(10);
keyspace.prepareQuery(columnFamily)
.getKey(rowkey)
.withColumnRange(rangeBuilder.build())
.execute()
.getResult();
对于任何类型的colStart和colEnd Being,如果是复合的,则允许在每个组件上定义相等的部分复合
谢谢你的帮助。我无法使用上述方法完成所有我想做的事情,但我找到了第四种方法,尽管我不喜欢,但它仍然有效 我正在
code 1
中使用ByteBuffer
版本的with columnRange
。开始和结束缓冲区使用实际的复合类构建,如下所示:
公共静态ByteBuffer toRangeStart(列表,布尔值反转){
返回toRangeValue(列表,反转?ComponentEquality.GREATER_THAN_EQUAL:ComponentEquality.EQUAL);
}
公共静态ByteBuffer toRangeEnd(列表,布尔值反转){
返回toRangeValue(列表,反向?ComponentEquality.EQUAL:ComponentEquality.GREATER_大于_EQUAL);
}
公共静态ByteBuffer toRangeValue(列表、组件等式){
//我们使用了真正的复合材料,因为我们没有找到任何其他方法来构建这些范围
复合材料c=新复合材料();
int i;
对于(i=0;i
# Code 1
keyspace.prepareQuery(columnFamily)
.getKey(rowkey)
.withColumnRange(columnStart, columnEnd, false, 10)
.execute()
.getResult();
# Code 2
RangeBuilder rangeBuilder = new RangeBuilder()
.setStart(columnStart, CF.getColumnSerializer())
.setEnd(columnEnd, CF.getColumnSerializer())
.setReversed(false)
.setLimit(10);
keyspace.prepareQuery(columnFamily)
.getKey(rowkey)
.withColumnRange(rangeBuilder.build())
.execute()
.getResult();
# Code 3
CompositeRangeBuilder rangeBuilder = ((AnnotatedCompositeSerializer<Column>) colSerializer)
.buildRange()
.withPrefix(columnStart.colname)
.greaterThanEquals(columnStart.timeUUID)
.lessThanEquals(columnEnd.timeUUID)
.limit(10);
keyspace.prepareQuery(columnFamily)
.getKey(rowkey)
.withColumnRange(rangeBuilder.build())
.execute()
.getResult();
MultigetSliceQuery<K, C, V> q = HFactory.createMultigetSliceQuery(connection.getKeyspace(), this.getRowKeySerializer(), this.getColumnNameSerializer(), this.getColumnValueSerializer());
q.setColumnFamily(this.getCfName());
q.setKeys(keys)
q.setRange(colStart, colEnd, reversed, count);
q.execute();