2013-06-18 49 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