使用2个以上的分区键过滤Cassandra

时间:2017-03-07 00:56:57

标签: cassandra cql cqlsh nosql

希望过滤掉在特定日期范围内“持有”的所有用户,而不使用带有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

尝试使用与this StackOverflow question类似的内容,但无法使其返回所需的输出。

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()函数进行此类过滤 - 显示在之前的错误消息中。

1 个答案:

答案 0 :(得分:1)

我假设你实际上正在使用(id,date,action)的PRIMARY KEY来匹配你的列定义。

如果这是您需要满足的查询,那么实现此目的的最佳方法是创建包含所需数据的单独表。您在上面尝试的方法和参考帖子中显示的方法都是次优和反模式。 C *旨在让您通过分区键查询原因。将ALLOW FILTERING添加到查询中基本上会使其返回表中的所有数据,然后根据您的条件将其过滤掉。在诸如C *的分布式数据存储中,这种分散收集类型操作非常昂贵,并且通常会在任何合理大小的数据集中超时。