我想在Cassandra存储大约10亿条数据。数据项按时间排序,我要做的一个主要查询是按顺序查找两个时间范围之间的项目。如果可能的话,我真的更喜欢使用RandomParititioner。在Cassandra有办法做到这一点吗?
首先,由于我来自SQL,我假设我应该将每个事件创建为一行,但后来我发现我正在考虑错误的方式并且我应该使用列。 Cassandra中的列似乎是有序的,但我对它们的有序性感到困惑。如果我使用时间作为列名,是否有办法让所有列按顺序从一个时间到另一个列?
我看到的另一件事是二级索引的0.7特性,但是我找不到文档是否可以按顺序查看一系列内容。
我想要的只是Cassandra相当于这个SQL:“从Stuff中选择*,其中日期> X和日期< Y order by date asc”。我怎么能这样做?
答案 0 :(得分:5)
分区程序仅影响环周围密钥的分布,而不影响密钥中列的顺序。始终根据为列族定义的列比较器对列进行排序。
您可以使用SlicePredicate调用get_slice,该SlicePredicate指定SliceRange以获取范围内某个键的所有列。
要为数据建模,您可以为每天创建1行(或适当的时间分片),并为每条数据创建一列。像,
"yyyy-mm-dd" : { #key, one for each day
timeStampMillis1:dataid1 : "value1" # one column for each piece of data
timeStampMillis2:dataid2 : "value2"
timeStampMillis3:dataid3 : "value3"
}
列名应该是二进制的,使用二进制比较器。前8个字节是时间戳,而其余字节是数据的id。
假设X和Y在同一天,要查找X和Y之间的所有项目,请在日期键上执行get_slice,使用带有SliceRange的SlicePredicate指定X的开头和Y + 1的结束。开始和结束都是8字节的字节数组。
要查找多天的数据,请从多个键中读取。