2016-12-30 9 views
2

私はカサンドラを初めて使うので、ダースに関する記事を読んで、基本を知っています。すべてのチュートリアルでは、1列または2列の効率的なデータ検索と時間範囲が示されています。私が見つけられなかったのは、より多くの条件がある場合、データを正しくモデル化する方法でした。複数の条件を持つカッサンドラデータモデル

  • イベントタイプ
  • 時間
  • メール
  • User_age
  • user_country
  • USER_LANGUAGE
  • を:

    私が言って、大きなイベントはかなりの数の列を持つ、データベースを正規化してい

  • など。

すべての列でクエリできるようにする必要があります。だから、RDBMSで、私はクエリを実行します:

SELECT email FROM table WHERE time > X AND user_age BETWEEN X AND X AND user_language = 'nl'など。

を私は、各列に別々のテーブルを作ることができます知っているが、その後、私はまだ結果を結合する必要があります。これは悪いアプローチではないかもしれませんが、サブクエリがないので疑問に思っています。

私の質問は明らかに、カサンドラでこの種のデータを正しくモデル化できますか?

ありがとうございます!

+0

潜在的な解決方法は次のとおりです。 イベントタイプごとに個別のテーブルを作成します。 パーティションキーとして使用できる「merchant_id」列があり、常に1つのパーティションにあるtimerangeとmerchant_idを検索します。 残りをセカンダリインデックスとして追加できますか? eventtypeテーブル+ merchant_id +時間の選択にはまだ潜在的に何百万もの行が存在する可能性があります。 –

答えて

4

すべての列でクエリできるようにする必要があります。

私はそこであなたを止めさせてください。 Cassandraでは、予想されるクエリパターンに基づいてテーブルを作成し、通常はテーブルが単一のクエリをサポートします。あなたのケースでは、「かなりの数の」列があり、そのデータをそれぞれの可能なクエリをサポートするように設計されたテーブルに複製する必要があります。それは非常に素早く大きくてうまくいかないでしょう。

残りを2次インデックスとして追加できますか? eventtypeテーブル+ merchant_id +時間の選択にはまだ潜在的に何百万もの行が存在する可能性があります。

セカンダリインデックスは、途中のカーディナリティー列で使用するためのものです。したがって、極端に低いカーディナリティ列と非常に高いカーディナリティ列の両方が、2次インデックスには悪いです。問題は、Cassandraがあなたのノードの1つをコーディネーターとして選んで各ノードのインデックスをスキャンし(ネットワーク時間を浪費する)、結果セットを構築して返さなければならないことです。これは、パフォーマンスの低い処方箋で、分散データベースを扱うためのベストプラクティスの中に浮かび上がっています。

要するに、Cassandraはこのような使用例には適していません。 OLAP型のクエリを実行できるように思えます。そのためには、その目的に適したツールを使用する必要があります。

+0

ありがとうございましたAaron写真はあなたの答えです。 Merchantパーティションキーとtimuuidをクラスタリングキーに使用すると、そのパーティションのみのインデックスが作成され、高速に保持されることを期待していました。 私はolapに精通していませんが、分析のためのもので、ユーザーIDを取得していないようです。 (私はapache kylinを見た)。 あなたはもっと良い服装になると思いますか?多分ハーフアウト? –

+0

このためにhadoopを使用しようとします –

関連する問題