是否可以获取Cassandra复合键的所有值?

2 投票
2 回答
704 浏览
提问于 2025-04-18 02:14

假设我有:

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

撰写回答