2016-10-10 47 views
0

对不起,标题可能会/可能不会详细说明我的意图。Cassandra选择可能没有主键的集群密钥范围

这是问题所在。我需要根据日期范围选择数据,并且我们的大多数查询都有用于查询的'id'字段。

所以,我已经创建了数据模型,ID为主键,日期为集群键。

本质上就像下面(我只是使用假/示例语句,因为我不能给出实际的细节)。

create table tab1(
    id text, 
    col1 text, 
    ... coln text, 
    rec_date date, 
    rec_time timestamp, 
    PRIMARY KEY((id),rec_date,rec_time) 
) WITH CLUSTERING ORDER BY rec_date DESC, rec_time DESC; 

它适用于大多数的查询和工作正常。

但是,我试图优化以下情况。

- >所有比日ABCD-XY-KL

哪个以下方法之一将是为我好,更多的记录?或者比这两个更好。

1)非常基本或简单的方法。使用查询:

select * from tab1 where id > '0' AND rec_date > 'abcd-xy-kl' 

每条记录​​将基本上是比 '0' 更高。它可能仍然会进行全表扫描。

2)创建于rec_date二级指标和简单的使用查询:

select * from tab1 where rec_date > 'abcd-xy-kl' 

此外,一个关键的事情是我使用的火花,并使用cassandraSqlContext.sql得到数据框。

所以,考虑到以上所有的细节,哪种方法会更好。

回答

0

在第一个例子中,我没有看到用id进行过滤。以下应工作,并会从我的角度更好的方法:

select * from tab1 where rec_date > 'abcd-xy-kl' ALLOW FILTERING; 

注意,它不会不工作在年底允许过滤的。

0

您不能使用> 0作为分区键。它不被Cassandra支持。有关WHERE部分查询限制的更多信息,请检查documentation

为了有效地查询您的集群密钥,您确实需要使用辅助索引。避免使用ALLOW FILTERING,除非您知道自己在做什么,因为它可能会触发“分布式”扫描并且性能很差。请查阅documentation了解更多信息。