说我有:
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,32463l)”。实际上我不会知道所有各种设备所以我想抓住它们“全部”。我该怎么做?
我正在处理时间序列分钟数据,所以我觉得一年是合理的分区。
答案 0 :(得分: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版本。
答案 1 :(得分:1)
您可以使用ALLOW FILTERING获取所有内容,但应注意这在性能方面成本很高,因为所有节点都需要回复:
select distinct device_id, site_id, year_id from data_by_year ALLOW FILTERING;
通过包含限制条款可以缓解性能问题,但这不允许您翻阅所有数据。如果你想要分页,你可能想要使用带有分页功能的datastax java驱动程序(或者等待分页在datastax python驱动程序中着陆)。
如果以上都不适用于您的用例,重新设计您的表可能是一个更好的选择(并且可能涉及二级索引,但也可能导致性能损失)。