Cassandra数据模型

时间:2016-11-30 21:24:03

标签: cassandra cql

我有下表来存储时间序列数据:

CREATE TABLE alerts_by_year_day (
    day_of_year int,
    year int,
    alert_timestamp timestamp,
    serial_number text,
    alert_id uuid,
    alert_type text,
    ....
    ....
  PRIMARY KEY((year, day_of_year), alert_timestamp, serial_number, alert_id)
) WITH CLUSTERING ORDER BY (alert_timestamp DESC, serial_number DESC);
  1. 对于UI报告,我想检索给定时间段内的所有警报。我有这个问题:
  2.   

    从alerts_by_year_day中选择*,其中year = 2015,day_of_year in(241,240);

    但是这个查询返回的结果是ASC年度顺序,然后是ASC顺序。 所以这样的结果

      

    2015 | 240 | .....

         

    2015 | 241 | .....

    但我想先显示最新结果或按降序显示最新结果。通过alert_timestamp添加'顺序;'给出错误 那么如何显示降序的结果呢?

    1. 然后,在给定的时间段内,我只想根据alert_type检索某些类型的警报。
    2. 所以我创建了一个这样的mat视图:

      CREATE MATERIALIZED VIEW alerts_by_type_and_timestamp AS 
          SELECT *
          FROM alerts_by_year_day
          WHERE alert_timestamp IS NOT NULL AND
              alert_type IS NOT NULL AND 
              day_of_year IS NOT NULL AND 
              year IS NOT NULL AND serial_number IS NOT NULL AND 
              alert_id IS NOT NULL
          PRIMARY KEY ((year, day_of_year, alert_type), alert_timestamp, serial_number, alert_id)
          WITH CLUSTERING ORDER BY (alert_timestamp DESC, serial_number DESC, alert_id DESC);
      

      但当然它首先按类型返回结果,然后按时间戳返回结果。 我正在寻找的只是类型的一个子集,并且在desc顺序中生成它们。 那可能在卡桑德拉吗?

      由于

1 个答案:

答案 0 :(得分:1)

分区的顺序是令牌顺序。它是主键的murmur3哈希的顺序。即:

cqlsh:test> select * from alerts_by_year_day ;

 year | day_of_year | alert_timestamp                 | serial_number | alert_id                             | alert_type
------+-------------+---------------------------------+---------------+--------------------------------------+------------
 2015 |          10 | 1970-01-01 00:00:00.001000+0000 |          s123 | b7baa710-b87b-11e6-9137-eb2177fd2cc2 |       type
 2015 |         110 | 1970-01-01 00:00:00.001000+0000 |          s123 | bf110270-b87b-11e6-9137-eb2177fd2cc2 |       type
 2015 |          11 | 1970-01-01 00:00:00.001000+0000 |          s123 | bce08de1-b87b-11e6-9137-eb2177fd2cc2 |       type
 2016 |         110 | 1970-01-01 00:00:00.001000+0000 |          s123 | c2e22eb1-b87b-11e6-9137-eb2177fd2cc2 |       type

因为你的IN查询它按照那个顺序行走(你无法控制)。掩护下必须对主键的每个组合进行单独查询。

这需要在in子句中为每个值提取多次,如果你放入太多内容就会快速效率低,因为它给你的协调器带来了很大的负担。只需进行两次异步 select查询,其成本几乎相同。然后您可以按照您想要的顺序阅读。这也使您无需在群集中使单个协调器管理对多个节点的提取,最终这有助于提高群集运行状况。每天1个查询在您的应用程序中进行迭代都不错。

如果日期不是“每天”,可能需要考虑在执行查询之前插入的(year, day_of_year)(type, year, day_of_year)只有year = 2015 days = query('select * from alert_day_index where year = %s', year) results = [] for day in days: results.extend(query('select * from alerts_by_year_day where year = %s and day_of_year = %s', year, day)) stun.l.google.com:19305的第二个表格。

  

注意:可以将本地保留在内存缓存中,这样就不会有数千次不必要的写入,只能写一次但是可以多次写入多个app实例或重新启动

recvfrom

如果您有很多天需要查询异步,那么查询的延迟不会阻止应用程序的吞吐量。