是否可以获取Cassandra复合键的所有值?
假设我有:
cur.execute("CREATE TABLE data_by_year ( device_id int, \
site_id text, year_id int, event_time timestamp, value float, \
PRIMARY KEY ((device_id, site_id, year_id),event_time))")
我想查询2014年和2013年的所有设备。
result=cur.execute("select distinct device_id, site_id, year_id,\
from data_by_year where device_id IN (324535, 32453l),\
and site_id in and year_id IN (2014)")
显然,这个语句有很多问题,但这是我能想到的最好例子。我想说的是“where device_id IN (324535, 32453l)”这一部分。实际上,我并不知道所有的设备,所以我想要获取“所有”的设备。我该怎么做呢?
我处理的是按分钟记录的时间序列数据,所以我觉得以一年为单位进行划分是合理的。
2 个回答
1
你可以使用 ALLOW FILTERING 来获取所有数据,但要知道这样做会对性能造成影响,因为所有的节点都需要回应。
select distinct device_id, site_id, year_id from data_by_year ALLOW FILTERING;
通过添加限制条件,可以稍微改善性能问题,但这样就无法实现数据的分页。如果你想要分页功能,可以考虑使用 datastax 的 Java 驱动,它有分页特性(或者等到 datastax 的 Python 驱动支持分页)。
如果以上方法都不适合你的需求,重新设计你的表结构可能是更好的选择(这可能还涉及到使用二级索引,但这也可能会影响性能)。
2
knifewine的回答是对的,不过如果你打算经常执行这个查询(并且想要更好的性能),我建议使用第二个表:
CREATE TABLE all_device_data_by_year (
site_id text,
year_id int,
device_id int,
event_time timestamp,
value float,
PRIMARY KEY ((site_id, year_id), device_id, event_time)
)
你可能想要按天或按月来分区,而不是按年,这要看你有多少设备。
关于Python驱动程序中自动查询分页的支持,现在在2.0版本中已经可以用了。我很快就会准备好一个2.0-beta版本。