2016-04-20 8 views
0

テーブル従業員は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

これはできません。

唯一の並べ替えはクラスタリング列にあり、例ではemp_idです。

2

選択文では注文していません。作成できるのは、create文でのみです。この理由はシンプルです。注文はパフォーマンスの犠牲者です。カサンドラの焦点はデータの書き方です。つまり、カサンドラは定義された注文にデータを書き込む際に本当に優れたパフォーマンスを発揮します。 カサンドラの注文は主キーに基づいています。主キーの最初の部分はパーティションキーです。正しいパーティションキーは本当に重要です!同じパーティションキーを持つすべての行は同じマシン上にあります。つまり、同じパーティションキーで行をフィルタリングすることは、パフォーマンスの良い操作です。フィルタリング同じパーティションのない行は本当に遅いです。しかし、1つまたは2つのパーティションキーしか使用できません。これを行うと、あなたはcassandraの利点を利用しません。主キーの他の部分は列キーです。 Cassandraは主キー順でデータをソートします。あなたの例では、cassandraはemp_idだけでソートします。 複数の注文が必要な場合は、新しい列ファミリ(テーブル)を作成します。

employeeByDeptDate(PRIMARY KEY(DEPT、joining_date))

employeeByDeptSalary(PRIMARY KEY(DEPT、給与))

employeeByDeptFirstName(PRIMARY KEY(DEPT、FIRST_NAME:あなたのケースでは、このテーブルを作成することができます))

employeeByDeptEmp

は今、あなたは言うだろう(PRIMARY KEY(DEPT、EMP_ID)):どのような..私は複数のテーブルを作成する必要がなぜ。カサンドラは非正規化データベースです。データを複数回保存することは問題ではありません。 HDDストレージは安価です。 Cassandra 3.0には、マテリアライズド・ビューという新しい機能があります。複製されたデータを管理できる場所。

関連する問題