我想在 Cassandra-0.7.8 上使用 ASC/DSC 顺序执行 BETWEEN、ORDER BY 等 SQL 操作。
据我所知,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.
提前致谢。
问候,
塔米扎南尔
最佳答案
Select * from emp where dept='IT' ORDER BY dob ASC.
您可以使用内置的二级索引来选择“部门”列具有特定值的行。但是,行将按照分区程序(RandomPartitioner 或 OrderPreservingPartitioner)确定的顺序返回。要按任意值(例如 DOB)排序,您需要在客户端进行排序。
或者,您可以通过为每个部门设置一行,为每个员工设置一列,按 DOB 键控(并因此排序)来直接支持此查询。但要小心共同生日!并且您仍然需要后续查询来检索所选员工的其他数据(您的 SELECT * 的结果),除非您进行非规范化以便所需数据也存储在索引中。
Select * from emp where eno BETWEEN ? AND ? ORDER BY dob ASC.
Cassandra 中的二级索引查询需要至少一个相等项,所以我认为你可以做 dept='IT' AND eno >=X AND eno <=y,但不仅仅是一个 BETWEEN 风格的查询。
您可以通过创建自己的索引行来做到这一点,每个员工都有一列,以员工编号为键,并使用适当的比较器,以便所有列自动按员工编号顺序排序。然后您可以对该行进行范围查询以获取匹配员工的列表 - 但您需要进一步查询以检索每个员工(dob 等)的其他数据,除非您进行非规范化以便所需的数据也存储在索引中.您仍然需要在客户端进行 DOB 订购。
关于Cassandra BETWEEN & ORDER BY 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7255734/