2016-02-17 16 views
6

カッサンドラのテーブルに最後に挿入された行を取得したい。それを得る方法?何か案が?カッサンドラで最後に挿入された行を取得するには?

私は、mysqlをcassandraに置き換えてプロジェクトを開発しています。私はすべてのSQLクエリを取り除き、それらをすべてcassandraに書きたいと思っています。

+0

クラスタ化された環境では、最後に挿入されたエントリを特定することは事実上不可能です。カサンドラも例外ではない。 –

+0

Cassandraの人にとって:MySQLの「最後に挿入された行」の概念は、実際にはINSERT文を介してクライアントによって挿入された行の(自動インクリメント)IDです。たとえば、主キーが 'timeuuid'で、' now() '関数を使って新しい行の値を自動的に生成すると、これはCassandraの本当の問題です。明らかに、新しい行のタイムアウトを決定する方法はありませんが、ドライバに追加するのは簡単なことです。 – Shannon

答えて

2

カッサンドラのテーブルに最後に挿入された行を取得したいと思います。それを得る方法?何か案が?

それは何を要求すると、ほんの少しの理解を与えるために、キューパターン(で私の最後のメッセージを与える)とキュー知らためのアンチパターンカサンドラある

8

である、ことはできません。 ..

すべてのCassandraクエリの問題と同様に、クエリはそのために特別に設計されたモデルによって処理される必要があります。これは、クエリベースのモデリングと呼ばれます。最後に挿入された行の問合せは、すべての表に組み込まれている本来の機能ではありません。事前にモデルを設計する必要があります。

たとえば、ユーザーのデータを格納するテーブルがあるとします。

CREATE TABLE users (
    username TEXT, 
    email TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    PRIMARY KEY (username)); 

私はこのテーブルの上にSELECT * FROM users LIMIT 1を実行した場合、私の結果セットが単一の行が含まれます。その行は、最も低いハッシュ値のusername(私のパーティションキー)を含む行になります。これは、Cassandraがデータをクラスタに格納する方法であるためです。私はそれが最後に追加されたかどうかを知る方法がないので、これはあなたにとってひどく有用ではないでしょう。

一方、ユーザーがアカウント情報に行った更新を追跡するように設計されたテーブルがあるとします。

CREATE TABLE userUpdates (
    username TEXT, 
    lastUpdated TIMEUUID, 
    email TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    PRIMARY KEY (username,lastUpdated)) 
WITH CLUSTERING ORDER BY (lastUpdated DESC); 

次の私は、3行アップサートう:私はちょうどSELECT username, email, dateof(lastUpdated) FROM userupdates LIMIT 1私が最も最近更新されていないジェデディアケルマーンのデータを、取得します場合

> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('bkerman',now(),'[email protected]','Bob','Kerman'); 
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('jkerman',now(),'[email protected]','Jebediah','Kerman'); 
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('bkerman',now(),'[email protected]','Bob','Kerman'); 

> SELECT username, email, dateof(lastUpdated) FROM userupdates; 

username | email    | system.dateof(lastupdated) 
----------+-------------------+---------------------------- 
    jkerman | [email protected] | 2016-02-17 15:31:39+0000 
    bkerman | [email protected] | 2016-02-17 15:32:22+0000 
    bkerman | [email protected] | 2016-02-17 15:31:38+0000 

(3 rows) 

を。しかし、私がパーティションをusername='bkerman'に制限した場合、LIMIT 1でBob Kermanの最新の行が得られます。

> SELECT username, email, dateof(lastUpdated) FROM userupdates WHERE username='bkerman' LIMIT 1; 

username | email    | system.dateof(lastupdated) 
----------+-------------------+---------------------------- 
    bkerman | [email protected] | 2016-02-17 15:32:22+0000 

(1 rows) 

これは私がlastUpdatedにを降順のクラスタリング順序を指定しているため、動作します:

WITH CLUSTERING ORDER BY (lastUpdated DESC); 

このように、各パーティション内の結果がで最も最近アップサート行に返されますしたがって、LIMIT 1は最新の行を照会する方法になります。要約すると

、それはそれを理解することが重要である:クラスタ内の

  • カサンドラの受注データパーティションキーのハッシュ値によって。これにより、より均一なデータ配信が保証されます。
  • Cassandra CLUSTERING ORDERデータのディスク上でのソート順をに、内にパーティションキーを適用します。
  • 各テーブルに最も最近更新された行を取得することはできませんが、パーティションの各行に対して、その行を返すことができます。

t1; dr; Cassandraでのクエリは、MySQLやRDBMSとはまったく異なります。最後に更新された行(パーティション用)を照会する必要がある場合は、おそらくテーブルをモデル化してサポートする方法があります。

+0

ありがとうアーロン.. :) – Mohanish

関連する問題