我们希望从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;
这似乎适用于常规RDBMS风格"列家庭。但是如何在"宽行"?的情况下限制列?我还应该使用限制条款吗?像这样:
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>显示版本 [cqlsh 4.1.1 |卡桑德拉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'};