2013-06-22 9 views
21

私はcassandraを初めて使用しています。ここで私は2つのテーブルEVENTSTOWERを持っています。私はいくつかのクエリのためにそれらに参加する必要があります。しかし、私はそれを行うことはできません。cassandra cqlで2つ以上のテーブルを使用して結合クエリを実行する方法

EVENTSテーブルの構造:TOWERテーブルの

eid int PRIMARY KEY, 
a_end_tow_id text, 
a_home_circle text, 
a_home_operator text, 
a_imei text, 
a_imsi text, 

は、構造:今すぐ

tid int PRIMARY KEY, 
tower_address_1 text, 
tower_address_2 text, 
tower_azimuth text, 
tower_cgi text, 
tower_circle text, 
tower_id_no text, 
tower_lat_d text, 
tower_long_d text, 
tower_name text, 

、私はのデータをフェッチすることができるようEIDTIDに関して、これらのテーブルに参加したいです両方のテーブル。

+0

[インナーカサンドラCQLに参加]の可能な重複(https://stackoverflow.com/questions/16790297/inner-join-in-cassandra-cql) – Raedwald

答えて

52

Cassandra =結合なし。あなたのモデルは100%リレーショナルです。あなたはカサンドラのためにそれを再考する必要があります。 these slidesをご覧ください。彼らは、cassandraのデータをどのようにモデル化するかについて深く掘り下げています。また、トピックをカバーするwebinarもあります。しかし、あなたが関係を必要とする場合、カサンドラは仕事のためのツールではないので、外来キーを考えたり、テーブルに参加したりしないでください。

なぜですか?
したがって、一貫性をチェックし、リレーショナルデータベースが行う多くのことを行う必要があるため、cassandraが提供するパフォーマンスとスケーラビリティが失われます。

どうすればよいですか?
DENORMALIZE! 1つのテーブルにたくさんのデータがありますか?しかし、テーブルには列が多すぎます!
だから? Cassandraはテーブル内の非常に多数の列を処理できます。

もう1つのことは、クライアントアプリケーションで結合をシミュレートすることです。コード内の2つのデータセットを一致させますが、すべての情報を繰り返し処理する必要があるため、これは非常に遅くなります。

もう1つの方法は、複数のクエリを実行することです。必要なイベントを選択し、次に一致するタワーを選択します。

+0

は、それは私のカサンドラテーブルのredunduntデータを格納しても大丈夫です例えば、私はuser_detailテーブルとコメントテーブルを持っています。どちらの表にも共通の列user_idが1つあります。私は他のテーブルをクエリする必要はありませんので、私はコメントテーブルに冗長なデータを格納する必要がありますか? –

+0

'別の方法は、複数のクエリを実行することです。必要なイベントを選択し、次に一致するタワーを選択します。'2つのSELECTクエリ、たとえばSELECT IDをtable1から実行し、次にSELCT col1、col2 FROM table2を実行することを意味しますか?col3 = ?それはカッサンドラのデータモデルごとですか? – manish

0

PlayOrmは、パーティションに参加できる特別なScalable SQL言語(つまり、10億行をさらに10億行に増やしたくない)を使用して、スケーラブルシステムで結合を実行するのに適しています。これにはたくさんのnoSQLパターンがあり、hibernateとJPAから完全な休憩を取って、必要なときにクライアント側の結合を持つnoSQLパターンを模倣します。

5

Cassandraでテーブルを結合してクエリを実行できる方法はいくつかあります。もちろん、データモデルの部分を再考する必要があります。

  1. カサンドラ(いずれかのオープンソースまたはDataStax Enterpriseの - DSE)で使用Apache Spark’s SparkSQL™。
  2. CassandraとDSEのDataStax provided ODBCコネクタを使用してください。
関連する問題