Cassandra按多列排序

时间:2016-04-20 10:29:59

标签: cassandra cql3

我在cassandra中有一名员工。

CREATE TABLE employee (
    emp_id       text,
    joining_date TIMESTAMP,
    salary       double,
    first_name   text,
    dept         text,
    last_name    TIMESTAMP,
    PRIMARY KEY (dept,emp_id));

我需要能够根据不同的列对cql查询结果进行排序。即,我需要支持下面提到的所有查询。 有没有办法可以在原生cassandra中实现这一目标。

select * from employee order by emp_id;
select * from employee order by joining_date;
select * from employee order by salary;
select * from employee order by first_name;
etc.,

2 个答案:

答案 0 :(得分:2)

您没有在select语句中订购。您只能在create语句中设置订单。原因很简单:订购是性能杀手。 Cassandras的重点是数据写作。这意味着:Cassandra在为您定义的订单编写数据方面表现非常出色。 Cassandras排序基于主键。主键的第一部分是分区键。正确的分区键非常重要!具有相同分区键的所有行都在同一台计算机上。这意味着:使用相同的分区键过滤行是具有良好性能的操作。过滤没有相同分区的行真的很慢。但是您不能只使用一个或两个分区键。如果你这样做,你就不会使用cassandra的好处。主键的其他部分是列键。 Cassandra将按主键顺序对数据进行排序。在您的示例中,cassandra将仅按emp_id排序。 如果您需要多个订单,请创建一个新的列族(表)。在您的情况下,您可以创建此表:

employeeByDeptDate(PRIMARY KEY(dept,joined_date))

employeeByDeptSalary(PRIMARY KEY(dept,salary))

employeeByDeptFirstName(PRIMARY KEY(dept,first_name))

employeeByDeptEmp(PRIMARY KEY(dept,emp_id))

现在你会说:什么..为什么我要创建多个表。 Cassandra是一个非规范化的数据库。保存数据不止一次都不是问题。硬盘存储很便宜。 Cassandra 3.0有一个新功能,称为物化视图。您可以管理重复数据的地方。

答案 1 :(得分:0)

这是不可能的。

您可以拥有的唯一排序是群集列,在您的示例中,它是emp_id