2013-06-18 46 views
0

我有一個coulmn家庭如下卡桑德拉1.2:卡桑德拉where子句.could沒有找到合適的行

time   | class_name     | level_log | message  | thread_name 
-----------------+-----------------------------+-----------+---------------+------------- 
121118135945759 | ir.apk.tm.test.LoggerSimple |  DEBUG | This is DEBUG |  main 
121118135947310 | ir.apk.tm.test.LoggerSimple |  ERROR | This is ERROR |  main 
121118135947855 | ir.apk.tm.test.LoggerSimple |  WARN | This is WARN |  main 
121118135946221 | ir.apk.tm.test.LoggerSimple |  DEBUG | This is DEBUG |  main 
121118135951461 | ir.apk.tm.test.LoggerSimple |  WARN | This is WARN |  main 

當我使用這個查詢:

SELECT * FROM LogTM WHERE token(time) > token(0); 

我什麼也沒得到!但正如你所看到的所有時間值都大於零!

這是CF模式:

CREATE TABLE logtm(
     time bigint PRIMARY KEY , 
     level_log text , 
     thread_name text , 
     class_name text , 
     msg text 
); 

任何機構可以幫助?

謝謝:)

+0

發佈您的架構以及您正在使用的分區器。 – Theo

+0

我添加架構以發佈 – zsh

+0

爲什麼使用令牌?如果你用令牌散列0,那麼輸出不會是0. –

回答

4

如果你不使用有序分區(如果你不知道這是什麼意思你不)該查詢並沒有做什麼你的想法。僅僅因爲兩個時間戳按一種方式排序並不意味着它們的標記就行。令牌是單元格值的(Murmur3)散列(除非您更改了分區程序)。

如果您需要執行範圍查詢,則不能在分區鍵上執行此操作,而只能在集羣鍵上執行此操作。你能做到這一點的方法之一是使用這樣的模式:

CREATE TABLE LogTM (
    shard INT, 
    time INT, 
    class_name ASCII, 
    level_log ASCII, 
    thread_name ASCII, 
    message TEXT, 
    PRIMARY KEY (shard, time, class_name, level_log, thread_name) 
) 

如果設置shard零架構將大致相當於你現在在做什麼,但查詢SELECT * FROM LogTM WHERE timestamp > 0會給你的結果你的期望。

但是,性能會很糟糕。使用單個值shard,只會創建一個分區/行,並且您將只使用集羣中的單個節點(並且該節點將非常忙,試圖壓縮該單個行)。

因此,您需要找出一種方法將負載分散到更多節點上。一種方法是在0到359之間選擇一個隨機分片(如果你喜歡兩個倍數,則選擇0到255),確切的範圍並不重要,只需要一個數量級或比節點),並在讀回時從所有碎片中讀取:SELECT * FROM LogTM WHERE shard IN (0,1,2,...)(您需要在列表中包含所有碎片,以代替...)。

你也可以通過散列消息選擇分片,這樣你就不必擔心重複。

您需要告訴我們更多關於您正在嘗試執行的操作的信息,特別是您打算如何查詢數據。不要去做我上面描述的事情,這可能是你的用例完全錯誤的,我只是想給你一個例子,以便我可以解釋Cassandra內部發生了什麼。

+0

我不知道什麼是分區器!你能解釋一下嗎? – zsh

+0

@zahra在評論中沒有足夠的空間,並且它的知識超過了我[這裏](http://www.datastax.com/docs/1.2/cluster_architecture/partitioners) –

+0

我怎麼能找到什麼partitioner我在用? – zsh