希望过滤掉在特定日期范围内“持有”的所有用户,而不使用带有Cassandra中每个日期列表的IN()语句,但需要注意的是我的表中有3个分区键。如果可以在Cassandra中使用token()函数,请分享。
CREATE TABLE priceOverTime (
id text,
date timestamp,
action text,
price double,
PRIMARY KEY ((id, date, action), price)
)
..
Partition keys: id, time, action
Clustering keys: price
SELECT * FROM priceOverTime WHERE date > '2017-01-01 00:00:00+0000'
AND date <= '2017-01-04 23:00:00+0000'
AND token(id) > previous_token
AND token(action) = token('hold')
AND LIMIT 100 ALLOW FILTERING;
id | date | action | price
--------------------------+----------
1 | 2017-01-01 00:00:00-0000 | buy | 100
1 | 2017-01-02 00:00:00-0000 | buy | 105
1 | 2017-01-03 00:00:00-0000 | sell | 103
1 | 2017-01-04 00:00:00-0000 | buy | 102
2 | 2017-01-01 00:00:00-0000 | buy | 100
2 | 2017-01-02 00:00:00-0000 | sell | 105
2 | 2017-01-03 00:00:00-0000 | hold | 103
2 | 2017-01-04 00:00:00-0000 | hold | 102
2 | 2017-01-03 00:00:00-0000 | hold | 103
2 | 2017-01-04 00:00:00-0000 | hold | 102
注意:使用Cassandra 2.2版。此外,我的Cassandra版本确实建议使用token()函数进行此类过滤 - 显示在之前的错误消息中。
答案 0 :(得分:1)
我假设你实际上正在使用(id,date,action)的PRIMARY KEY来匹配你的列定义。
如果这是您需要满足的查询,那么实现此目的的最佳方法是创建包含所需数据的单独表。您在上面尝试的方法和参考帖子中显示的方法都是次优和反模式。 C *旨在让您通过分区键查询原因。将ALLOW FILTERING添加到查询中基本上会使其返回表中的所有数据,然后根据您的条件将其过滤掉。在诸如C *的分布式数据存储中,这种分散收集类型操作非常昂贵,并且通常会在任何合理大小的数据集中超时。