2

说我有:

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)”。实际上,我不会知道所有各种设备,所以我想“全部”抓住它们。我该怎么做呢?

我正在处理时间序列分钟数据,所以我觉得一年是一个合理的分区。

4

2 回答 2

2

刀酒的回答是正确的,但如果您要经常执行此查询(并希望获得良好的性能),我建议使用第二个表:

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 版本。

于 2014-04-11T00:14:52.513 回答
1

您可以使用 ALLOW FILTERING 获取所有内容,但应注意这在性能方面代价高昂,因为所有节点都需要回复:

select distinct device_id, site_id, year_id from data_by_year ALLOW FILTERING;

通过包含限制子句可以稍微缓解性能问题,但这不允许您对所有数据进行分页。如果您想要分页,您可能需要使用具有分页功能的 datastax java 驱动程序(或等待分页进入 datastax python 驱动程序)。

如果以上都不适用于您的用例,那么重新设计您的表可能是一个更好的选择(并且可能涉及二级索引,但这也会导致性能损失)。

于 2014-04-10T22:15:40.187 回答