【问题标题】:Is it possible to grab all values of a Cassandra composite key?是否可以获取 Cassandra 复合键的所有值?
【发布时间】:2014-05-24 12:52:35
【问题描述】:

说我有:

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

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

【问题讨论】:

    标签: python cassandra time-series cql3 cqlsh


    【解决方案1】:

    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 测试版。

    【讨论】:

    • 如果按月分区并使用设备作为列键,我将接近 400 万列。可以安全地假设这对 Cassandra 来说只是杯水车薪吗?根据需要的查询类型将数据存储翻倍是一种常见做法吗?
    • 那么我会按天分区。一个分区中有四百万行是可以的,但最好在容易的情况下将其分解得更多。是的,为了有效地支持多种查询模式,对数据进行非规范化并写入多个副本是很常见的。通常每个查询模式都有一个表(如果您希望优化读取效率,这通常是您需要关注的)。
    【解决方案2】:

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

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

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

    如果上述方法都不适合您的用例,那么重新设计您的表可能是更好的选择(并且可能涉及二级索引,但这也会导致性能下降)。

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      相关资源
      最近更新 更多