cassandra cql查询在rowkey和clustering列中的条件

时间:2013-10-17 10:18:26

标签: cassandra cql

我是cassandra的新手。我有一个复合主键表。该表的描述是

CREATE TABLE testtable (
  foid bigint,
  id bigint,
  severity int,
  category int,
  ack boolean,
  PRIMARY KEY (foid, id, severity, category)
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='NONE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

我的要求是,我需要使用foid查询表格,条件为id,范围条件severity条件

所以当我尝试以下查询时

select * from testtable where foid in (5,6) and id>10 and severity in (5);

我收到错误消息

  

从testtable中选择*,其中(5,6)和id> 10中的foid和(5)中的严重性;

甚至severity列上的相同条件对我来说就足够了,这也不行。

有没有办法可以实现同样的目标

我尝试使用severitycategory的二级索引,但这并没有给我任何积极的信息。

1 个答案:

答案 0 :(得分:1)

您需要先连接限制主键,以便以下方法可以使用:

select * from testtable where foid in (1) and id=2 and severity<20 ;

但这不会:

select * from testtable where foid in (1) and id>10 and severity=3;

如何使查询的限制性降低(如您在问题中所建议的那样),如下所示

select * from testtable where foid in (5,6) and id>10

并在客户端对结果进行排序?

另一种(可能更具吸引力的)解决方案是根据您要执行查询的方式订购密钥,例如,

CREATE TABLE testtable2 (
  foid bigint,
  severity int,
  id bigint,
  category int,
  ack boolean,
  PRIMARY KEY (foid, severity, id, category)
)

允许你进行这样的查询(注意severity上的相等操作,severity上的IN操作不起作用):

select * from testtable2 where foid in (5,6) and severity=5 and id>10;

(使用cql测试[cqlsh 4.0.1 | Cassandra 2.0.1 | CQL规范3.1.1 | Thrift协议19.37.0])