Datastax驱动程序 - 限制列和获取列范围

时间:2018-01-31 07:23:47

标签: java cassandra datastax datastax-java-driver

我们希望从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'};

0 个答案:

没有答案