根据日期范围查询最小分区键(聚类键)

时间:2016-09-05 18:47:29

标签: cassandra

我在cassandra中有一个表Foo,有4列foo_id bigint,date datetime,ref_id bigint,type int

这里的分区键是foo_id。聚类键是日期desc,ref_id和类型

我想写一个CSQL查询,它等同于下面的SQL

select min(foo_id) from foo where date >= '2016-04-01 00:00:00+0000'

我写了以下CSQL

select foo_id from foo where 
foo_id IN (-9223372036854775808, 9223372036854775807) 
and date >= '2016-04-01 00:00:00+0000';

但这会返回空结果。

然后我试了

select foo_id from foo where 
  token(foo_id) > -9223372036854775808 
  and token(foo_id) < 9223372036854775807 
  and date >= '2016-04-01 00:00:00+0000';

但这会导致错误

Unable to execute CSQL Script on 'Cassandra'. Cannot execute this query
as it might involve data filtering and thus may have unpredictable 
performance. If you want to execute this query despite performance   
unpredictability, use ALLOW FILTERING.

我不想使用ALLOW FILTERING。但我希望在指定日期的开头有最小的foo_id。

1 个答案:

答案 0 :(得分:1)

您可能应该对数据进行非规范化并为此目的创建一个新表。我建议像:

CREATE TABLE foo_reverse (
    year int,
    month int,
    day int,

    foo_id bigint, 
    date datetime,
    ref_id bigint, 
    type int,
    PRIMARY KEY ((year, month, day), foo_id)
)

要获得最小的foo_id,您可以通过以下方式查询该表:

SELECT * FROM foo_reverse WHERE year = 2016 AND month = 4 AND day = 1 LIMIT 1;

该表格允许您每天查询&#34;&#34;基础。您可以更改分区键以更好地反映您的需求。通过选择合适的时间范围,注意你(和我)可能产生的潜在热点。