我有下表来存储时间序列数据:
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);
从alerts_by_year_day中选择*,其中year = 2015,day_of_year in(241,240);
但是这个查询返回的结果是ASC年度顺序,然后是ASC顺序。 所以这样的结果
2015 | 240 | .....
2015 | 241 | .....
但我想先显示最新结果或按降序显示最新结果。通过alert_timestamp添加'顺序;'给出错误 那么如何显示降序的结果呢?
所以我创建了一个这样的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顺序中生成它们。 那可能在卡桑德拉吗?
由于
答案 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
如果您有很多天需要查询异步,那么查询的延迟不会阻止应用程序的吞吐量。