对不起,标题可能/可能没有给出我想要的确切描述。
这是问题所在。我需要根据日期范围选择数据,我们的大多数查询都有' id'我们的查询中使用的字段。
因此,我创建了数据模型,其中id为主键,date为clustering key。
基本上就像下面一样(我只是使用假/样本语句,因为我无法提供实际细节)。
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'
另外,关键是我使用spark并使用cassandraSqlContext.sql来获取数据帧。
因此,考虑到上述所有细节,哪种方法会更好。?
答案 0 :(得分:0)
我没有在第一个示例中看到使用id过滤的重点。以下应该有效,从我的角度来看会更好:
select * from tab1 where rec_date > 'abcd-xy-kl' ALLOW FILTERING;
请注意,在最后没有允许过滤的情况下,它不会工作。
答案 1 :(得分:0)
您不能将> 0
用于分区键。 Cassandra不支持它。有关WHERE
部分查询限制的详细信息,请查看documentation。
为了有效地通过群集密钥进行查询,您确实需要使用二级索引。除非你知道自己在做什么,否则不要使用ALLOW FILTERING
,因为它可能触发“分布式”扫描并且执行效果非常差。有关详细信息,请查看documentation。