我在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。
答案 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;基础。您可以更改分区键以更好地反映您的需求。通过选择合适的时间范围,注意你(和我)可能产生的潜在热点。