它看起來像我需要學習一些Cassandra數據建模。我建議你去https://academy.datastax.com/courses並觀看一些課程(更具體地說是DS210和DS220),他們在註冊後可以免費使用。這是我認爲學習Cassandra的最好方法。我知道他們很長,但他們非常有用。
回答你的問題。你總是必須在你的查詢中指定分區鍵(你的例子中的符號),這就是爲什麼:當你插入數據時,Cassandra將散列主鍵並將數據存儲在負責該散列的節點上(這稱爲範圍)。因此,如果您的羣集中有1000個節點,並且您運行了您指定的SELECT查詢之一,那麼Cassandra將如何知道哪個節點具有該數據?可以使用ALLOW FILTERING搜索所有需要的數據的節點,但您可以想象這對於性能來說很糟糕。以下是更好理解的參考:https://www.datastax.com/dev/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key
解決此問題的方法是通過創建具有相同數據但分區鍵不同的多個表。是的,這會產生大量冗餘數據,但這真的很糟糕嗎?
這樣做的第一個代價是您需要購買更多的磁盤空間。但是磁盤空間很便宜,所以它不是什麼大問題。 CPU更昂貴。
第二個代價是您必須執行多次寫操作來保持表的一致性。但與SQL數據庫相比,Cassandra在寫入數據方面速度非常快。讀取更貴,但這對你的情況無關緊要,因爲只能讀取一次數據。
那麼你應該如何做到這一點?
在你的情況下,你將不得不爲你需要的每個新分區鍵創建一個新表。即創建4個新表,其中日期,國家,位置和區域作爲分區鍵。
對於計數爲< 5的select語句,它會變得更復雜一點。就像我之前說的,Cassandra想知道數據的位置究竟是什麼分區。因此,計算分區鍵並不會真正起到幫助作用。您還需要在查詢中指定主鍵。像這樣:
select * from info where symbol='AAA' AND count < 5;
但是,由於count不是聚簇鍵,所以這也不起作用。集羣用於對分區內的數據進行排序。您可以在表中擁有儘可能多的集羣密鑰。集羣密鑰是主鍵的一部分。主鍵的第一部分始終是分區鍵。所有後來的都是集羣密鑰。
CREATE TABLE IF NOT EXISTS INFO (symbol varchar, region varchar, country varchar, location varchar, date date,count varint, PRIMARY KEY(symbol,date,count,));
我知道這對於初學者來說都是令人困惑的,但是請記住Cassandra不是SQL數據庫。嘗試觀看我鏈接的一些視頻並閱讀Datastax文檔中的不同概念(它仍然比官方的Cassandra文檔更好)。
下面是一些術語的詞彙表我只是用:https://docs.datastax.com/en/glossary/doc/glossary/glossaryTOC.html
在卡桑德拉你不能與非主鍵,除非你在其上創建索引查詢。閱讀此:https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause –
你可以看看我的答案,並告訴我它是否有用。不要忘記標記答案,如果它幫助你接受。 –