Cassandra BETWEEN& ORDER BY操作

时间:2011-08-31 10:35:11

标签: cassandra

我想在Cassandra-0.7.8上执行SQL操作,例如BETWEEN,ORDER BY和ASC / DSC命令。

据我所知,Cassandra-0.7.8并没有直接支持这些操作。请告诉我有没有办法通过调整二级索引来实现这些目标?

以下是我的数据模型设计。

Emp(KS){
    User(CF):{
         bsanderson(RowKey): { eno, name, dept, dob, email }
     prothfuss(RowKey): { eno, name, dept, dob, email }
}
}

查询:

 - Select * from emp where dept='IT' ORDER BY dob ASC. 
 - Select * from emp where eno BETWEEN ? AND ? ORDER BY dob ASC.

提前致谢。

此致

Thamizhananl

2 个答案:

答案 0 :(得分:3)

Select * from emp where dept='IT' ORDER BY dob ASC.

您可以使用内置辅助索引选择'dept'列具有特定值的行。但是,行将按分区程序确定的顺序返回(RandomPartitioner或OrderPreservingPartitioner)。要按任意值(如DOB)进行排序,您需要对客户端进行排序。

或者,您可以直接支持此查询,方法是为每个部门添加一行,并为每个员工添加一列,由DOB键入(并因此排序)。但要小心分享生日!并且您仍然需要后续查询来检索所选员工的其他数据(SELECT *的结果),除非您反规范化以便所需数据也存储在索引中。

Select * from emp where eno BETWEEN ? AND ? ORDER BY dob ASC.

Cassandra中的二级索引查询需要至少一个相等项,所以我认为你可以做dept ='IT'和eno> = X AND eno< = y,但不仅仅是BETWEEN风格的查询。 / p>

您可以通过创建自己的索引行,每个员工的列,使用适当的比较器键入员工编号,以便所有列按员工编号顺序自动排序。然后,您可以对该行执行范围查询以获取匹配员工的列表 - 但是您需要进一步查询以检索每个员工的其他数据(dob等),除非您进行非规范化以便将所需数据存储在索引中。您仍然需要在客户端进行dob订购。

答案 1 :(得分:1)

据我所知,当您创建列族时,列将按比较器排序,您可以使用clustring键对您的意见进行排序 并且列族中的行将按分区器排序 我建议你阅读这篇论文 Cassandra权威指南第6章