我们想从Thrift转移到DataStax驱动程序以使用我们的Cassandra . 在我们的环中,我们有一些键空间和列族 .

一些列族是“常规”RDBMS样式,但有些是“宽行” .

在我们的API中,我们允许参数为

int limit - 限制列数

int rows - 限制行数

String from - 指示从哪个列获取数据

String to - 指示直到哪个列获取数据

目前,在Thrift中,我们使用 org.apache.cassandra.thrift.SliceRange.SliceRange(ByteBuffer start, ByteBuffer finish, boolean reversed, int count) 如下:

SliceRange range = new SliceRange(ByteBufferUtil.bytes(fromColumn), ByteBufferUtil.bytes(toColumn), false, limit);
predicate.setSlice_range(range);
//...
slices = connection.multiget_slice(list, parent, predicate, consistencyLevel);
//parse slices data internal code...

在DataStax中,我开始编写代码:

TableMetadata tableMetadata = cluster.getMetadata().getKeyspace(Metadata.quoteIfNecessary(keyspace)).getTable(Metadata.quoteIfNecessary(columnFamily)); 
Where selectWhere = QueryBuilder.select().from(tableMetadata).where(QueryBuilder.in("key", keys));
Statement statement = selectWhere.limit(rows).setConsistencyLevel(ConsistencyLevel.valueOf(consistencyLevel));
ResultSet rs = session.execute(statement);
JSONObject fullJson = new JSONObject();
for (Row row : rs){
    JSONObject rowJson = new JSONObject();
    ColumnDefinitions cd = row.getColumnDefinitions();
    for (ColumnDefinitions.Definition def : cd.asList()){
        String columnName = def.getName();
        if ("key".equals(columnName)){
            continue;
        }
        rowJson.put(columnName, row.getString(columnName));
    }
    fullJson.put(row.getString("key"), rowJson);
}
return fullJson;

这似乎适用于"regular RDBMS style"列系列 . 但是如何在"wide-rows"的情况下限制列?我还应该使用限制条款吗?像这样: selectWhere.limit(limit)

如何告诉datastax仅在特定范围内返回列?在具有“宽行”的CF中,如果我使用CLI获取数据,我会得到以下结果:

=> (name=myColumn1002432758, value=, timestamp=1437569115004000)
=> (name=myColumn1008916971, value=, timestamp=1437571455894000)
=> (name=myColumn1009257972, value=, timestamp=1437571311603000)
=> (name=myColumn1009735430, value=, timestamp=1419755102812000)
=> (name=myColumn1010271493, value=, timestamp=1437570712913000)
=> (name=myColumn1010783846, value=, timestamp=1419754313304000)
=> (name=myColumn1011325540, value=, timestamp=1437569756587000)

....

Returned 1560 results.
Elapsed time: 87 msec(s).

我在网上搜索并尝试了很多,但找不到工作示例 .

请指教 .

Cassandra细节:

cqlsh> show version [cqlsh 4.1.1 | Cassandra 2.0.13 | CQL规范3.1.1 |节俭协议19.39.0]

对java dse-java-driver-core-1.4.2.jar使用Datastax驱动程序

Java 7

如果需要更多细节,请告诉我 .

谢谢!

更新:cqlsh>描述表OFFLINE_1.XXXX;

CREATE TABLE "XXXX" (
key text,
column1 text,
value text,
PRIMARY KEY ((key), column1)
) WITH COMPACT STORAGE AND
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=1 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'chunk_length_kb': '64', 'sstable_compression': SnappyCompressor'};