2016-11-02 2 views
5

EDSジョブでデータ重複排除を実行するための中間ストレージとしてCassandraを検討しています。Cassandraの各パーティションキーの最初の行を取得

イベントのストリームがあり、それぞれにビジネスエンティティID、タイムスタンプ、値などがあるとします。私は各ビジネス・キーのイベント・タイムスタンプの点で最新の値を取得する必要がありますが、イベントは順不同です。

私の考えは、クラスタ化キーとしてパーティションキーとタイムスタンプなどのビジネスIDを持つステージング表を作成することでした。私はこの表にいくつかのデータを挿入する場合、私はいくつかの特定のパーティションの最新の値を取得することができます今すぐ

CREATE TABLE sample_keyspace.table1_copy1 (
id uuid, 
time timestamp, 
value text, 
PRIMARY KEY (id, time) 
) WITH CLUSTERING ORDER BY (time DESC) 

キー:

select * from table1 where id = 96b29b4b-b60b-4be9-9fa3-efa903511f2d limit 1; 

しかし、それは私が興味のすべてのビジネスキーのために、このようなクエリを発行することが必要となる

私は何ができるいくつかの効果的な方法があります。それはCQLで?

利用可能なすべてのパーティションキー(select distinct id from table1)を一覧表示する機能があります。ですから、私がCassandraのストレージモデルを調べると、各パーティションキーの最初の行を取得するのは難しくありません。

これはサポートされていますか?

答えて

13

あなたは3.6の後のバージョンを使用している場合、あなたは1に設定することができますPER PARTITION LIMITという名前のクエリのオプション(CASSANDRA-7017)があります。これはcqlshで3.10までCASSANDRA-12803で自動完了しません。

SELECT * FROM table1 PER PARTITION LIMIT 1; 
0

単語:いいえ。

パーティション化キーは、Cassandraが基本的にどのような量のデータでも動作できる理由です。パーティション化キーのハッシュを使用してデータを配置/検索する場所を決定します。そのため、CQL SELECTは常にパーティショニングキー全体で等価フィルタを実行する必要があります。各idの最初のtimeを見つけるために、Cassandraはすべてのノードにデータの任意のパーティションを尋ねる必要があります。次には、それぞれに対して複雑な操作を実行します。リレーショナルデータベースではこれが可能ですが、Cassandraではそうはしません。可能なのはフルテーブルスキャン(SELECT * from table1)またはパーティションスキャン(SELECT DISTINCT id FROM table1)ですが、複雑な操作にはリンクできません。

*)ここではALLOW FILTERINGを省略しています。この文脈では役に立たないためです。

関連する問題