2015-04-02 90 views
0

在您downvote之前,我想說我看了所有類似的問題,但我仍然遇到了可怕的「PRIMARY KEY列不能被限制」的錯誤。卡桑德拉時間範圍查詢

這裏是我的表結構:

CREATE TABLE IF NOT EXISTS events (
    id text, 
    name text, 
    start_time timestamp, 
    end_time timestamp, 
    parameters blob, 
    PRIMARY KEY (id, name, start_time, end_time) 
); 

而這裏的我試圖執行查詢:

SELECT * FROM events WHERE name = ? AND start_time >= ? AND end_time <= ?; 

我真的被困在此我。誰能告訴我我做錯了什麼?

感謝, 德尼茲

回答

1

這是你需要重塑你的數據,或者使用分佈式分析平臺查詢(如火花)。 Id描述了您的數據如何通過數據庫進行分發。由於在此查詢中未指定,因此將需要全表掃描來確定必要的行。卡桑德拉設計團隊已經決定,他們寧願你不要做一個查詢,而不是做一個不會擴展的查詢。

基本上每當你看到「COLUMN不能被限制」就意味着你試圖執行的查詢不能在你創建的表上有效地完成。

+1

感謝您的回答。儘管我使用的是嵌入Cassandra的單一模式,但我決定使用Spark。我想知道是否可以解決問題,並且您的答案對此行爲有意義。 – 2015-04-03 00:00:28

1

要運行查詢,使用允許濾波條款,

SELECT * FROM analytics.events WHERE name = ? AND start_time >= ? AND end_time <= ? ALLOW FILTERING; 
+0

不幸的是,我仍然收到「PRIMARY COLUMN end_time無法限制」錯誤。有任何想法嗎? – 2015-04-02 09:31:46

+1

使用'ALLOW FILTERING'不應該被鼓勵。 – Aaron 2015-04-02 13:28:57

0

要進行查詢的「general」rule是您必須至少傳遞所有分區鍵列,然後才能按照它們設置的順序添加每個鍵。「所以,爲了使您的工作成功, d需要在那裏添加where id = x

但是,看起來這個錯誤消息暗示的是,一旦你選擇了'start_time> 34',這就像「在鏈條下」一樣遠,否則它將需要「012B」標誌,所以它必須在單列上「只相等」組合在一起,所有這些都以速度的名義進行,這是可行的(儘管不提供範圍查詢):

SELECT * FROM events WHERE name = 'a' AND start_time = 33 and end_time <= 34 and id = '35'; 

如果你正在尋找的事件「在分Ÿ發生」也許像添加事件爲每分鐘的事件是正在進行或沒有什麼,或桶裝基於「hour」不同的數據模型是可能的,或什麼不是。另請參見https://stackoverflow.com/a/48755855/32453