我在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.,
答案 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
。