2016-09-05 148 views
0

分區鍵我有一個表中的Foo卡桑德拉與4列foo_id BIGINT,日期日期時間,REF_ID BIGINT,int類型查詢分鐘基於時間範圍(聚集鍵)

這裏的分區鍵是foo_id。聚集鍵是日期遞減,REF_ID和類型

我想寫一個CSQL查詢這是SQL的下方

select min(foo_id) from foo where date >= '2016-04-01 00:00:00+0000' 

相當於我寫了下面CSQL

select foo_id from foo where 
foo_id IN (-9223372036854775808, 9223372036854775807) 
and date >= '2016-04-01 00:00:00+0000'; 

但這返回空結果。

然後我試圖

select foo_id from foo where 
    token(foo_id) > -9223372036854775808 
    and token(foo_id) < 9223372036854775807 
    and date >= '2016-04-01 00:00:00+0000'; 

但這會導致錯誤

Unable to execute CSQL Script on 'Cassandra'. Cannot execute this query 
as it might involve data filtering and thus may have unpredictable 
performance. If you want to execute this query despite performance 
unpredictability, use ALLOW FILTERING. 

我不想使用允許過濾的。但我希望在指定日期開始時的foo_id的最小值。

回答

1

您應該反規範化數據併爲此目的創建一個新表。我建議是這樣的:

CREATE TABLE foo_reverse (
    year int, 
    month int, 
    day int, 

    foo_id bigint, 
    date datetime, 
    ref_id bigint, 
    type int, 
    PRIMARY KEY ((year, month, day), foo_id) 
) 

爲了獲得最小foo_id你會查詢該表由類似:

SELECT * FROM foo_reverse WHERE year = 2016 AND month = 4 AND day = 1 LIMIT 1; 

這一表格將允許你在「每日」的基礎上進行查詢。您可以更改分區鍵以更好地反映您的需求。請注意您(和我)可能通過選擇適當的時間範圍創建的潛在熱點。