为什么Cassandra查询不提取数据

时间:2015-07-07 10:30:56

标签: cassandra nosql

我一直在为一个列族建模。截至目前,主要关键是 主键((side,rundate),基金)。所以我正在执行以下查询

 select count(*) from cf_Summary 
 where side = 'Long'and rundate in ('2015-01-12 05:30:00','2015-01-13 05:30:00');

上面的查询返回1200.如果我在查询下运行,则返回0记录。

select count(*) from cf_Summary 
where token(side,rundate)>= token('Long','2015-01-12 05:30:00') and token(side,rundate) <= token('Long','2015-01-13 05:30:00');

令牌运算符可以应用于最后两个分区列,如datastax网站中所述。 http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

为什么我在第二个查询中得到0计数。 Side有两个Long和Short值,所以我想在某个时间长时间执行查询,有时在短时间内执行查询,有时在日期范围内执行两个值。在第一个查询中,我可以限制rundate,但可以查询long和shot。我知道两个行键都存储在不同的行上。

是否可以执行

select count(*) from cf_valuationsummary_1 
where token(side,rundate)>= token('Long','2015-01-02 05:30:00') and token(side,rundate) <= token('Short','2015-01-03 05:30:00');

协调器节点可以查询两个节点以获取数据,但我想从客户端应用程序执行单个查询,尽管存在性能问题

任何领先?

1 个答案:

答案 0 :(得分:0)

看起来您在两个查询中使用了不同的日期字符串。

在使用IN子句的第一个查询中,您使用了日期01-12和01-13。

但是在令牌查询中,您使用的是日期01-02和01-03。

所以也许你没有01-02和01-03的任何行。

除此之外,令牌查询看起来有效。

更新

我做了一些实验。我认为这种类型的查询可能只适用于ByteOrderedPartitioner。使用Murmur3Partitioner时,日期字符串不会对给定分区键的标记值进行排序。例如,使用此数据:

cqlsh:试验&gt; select * from cf_Summary;

 side  | rundate             | fund
-------+---------------------+------
 Short | 2015-01-13 05:30:00 |  HIJ
  Long | 2015-01-12 05:30:00 |  ABC
  Long | 2015-01-13 05:30:00 |  DEF
 Short | 2015-01-12 05:30:00 |  HIJ

我们得到这样的令牌值:

cqlsh:试验&gt;从cf_Summary中选择标记(side,rundate);

 token(side, rundate)
----------------------
 -2522183250639624078
 -2064350486281951596
 1812183325578390943
 7832903641319907586

因此,您可以看到具有较高日期的短行具有负标记值,而较早的短日期具有正标记值。因此,如果我对这些令牌值进行范围查询,则会找到零行。对于长行,它发生了早期日期的标记值为负,后一日期为正,因此找到两个长行。

cqlsh:试验&gt;从cf_Summary中选择count(*),其中token(side,rundate)&gt; = token('Short','2015-01-12 05:30:00')和token(side,rundate)&lt; = token('Short ','2015-01-13 05:30:00');

计数

 0

cqlsh:试验&gt;从cf_Summary中选择count(*),其中token(side,rundate)&gt; = token('Long','2015-01-12 05:30:00')和token(side,rundate)&lt; = token('Long ','2015-01-13 05:30:00');

计数

 2

所以一般来说,我不认为你要做的事情会起作用,因为令牌值与你日益增加的日期并不直接相关。