2016-11-30 395 views
1

我有以下表來存儲時間序列數據:卡桑德拉datamodelling

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報告我要檢索的給定時間內的所有警報。我有這樣的查詢:

SELECT * FROM alerts_by_year_day其中year = 2015和DAY_OF_YEAR在(241,240);

但是,此查詢返回的結果是年度ASC順序,然後是ASC順序的一天。 所以這樣的結果

2015 | 240 | .....

2015 | 241 | .....

但我想要先顯示最新結果或按降序顯示。通過alert_timestamp添加'order'給出了一個錯誤 那麼我如何顯示結果降序?

  1. 然後,對於給定的時間段,我只想根據alert_type檢索特定類型的警報。

所以我創造了這樣的墊子觀點:

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); 

但是,當然,它返回結果按類型第一,並通過時間戳。 我正在尋找的僅僅是類型的一個子集,並且按照它們的生成順序排列。 Cassandra可能嗎?

由於

回答

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子句中每個值的多次提取,並且如果您投入太多,可能會變得效率低下,因爲它會給協調器帶來很大的負擔。它的成本幾乎相同,只是使兩個異步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)) 

如果你有很多天只需要查詢異步,所以查詢的延遲不會阻止應用程序的吞吐量。

+0

感謝您的迴應!每天運行查詢並存儲所顯示日期的分頁詳細信息非常麻煩。 – user1860447