18

SQL データベースの Cassandra を改造して、SQL クエリに相当する Cassandra を見つけようとしています。CQL 3 と Cassandra v1.2 を使用しています。cassandra でデータベース設計をモデル化して、order by 句と非正規化テーブルをサポートし、結合操作をサポートできるようにしました。ただし、DISTINCT、SUM()、および GROUPBY に相当するものに関しては、私は海にいます

SELECT a1,MAX(b1) FROM demo1 group by a1.
SELECT DISTINCT (a2) FROM demo2 where b2='sea'
SELECT sum(a3), sum(b3) from demo3 where c3='water' and d3='ocean'

これは、過去数日間の私の仕事のショーストッパーのようなものです。Cassandra で、これらの種類のクエリをサポートするために db スキーマをモデル化できる方法はありますか? Cassandra での方法は考えられません。このようなクエリは、Cassandra を使用してどのように実装されますか?

Cassandra 上のハイブ レイヤーがこれらのクエリを機能させる可能性があることを読みました。そのようなクエリを Cassandra でサポートできる唯一の方法であるかどうか疑問に思っています..? Plsは他の可能な方法についてアドバイスします..

4

4 に答える 4

22

これは古い質問ですが、Google の検索結果ではかなり上位に表示されます。だから私は最新情報を提供したいと思いました。

Cassandra 2.2+ は、ユーザー定義関数とユーザー定義集計をサポートしています。警告: これは、(@Theo によって指摘されたように) もうデータ モデリングを行う必要がないという意味ではなく、取得時にデータをわずかに前処理できるようにするだけです。

SELECT DISTINCT (a2) FROM demo2 where b2='sea'

を実装DISTINCTするには、関数と集計を定義する必要があります。ユーザー定義であることを強調するのuniqではなく、関数と集計の両方を呼び出します。distinct

CREATE OR REPLACE FUNCTION uniq(state set<text>, val text)
  CALLED ON NULL INPUT RETURNS set<text> LANGUAGE java
  AS 'state.add(val); return state;';
CREATE OR REPLACE AGGREGATE uniq(text)
  SFUNC uniq STYPE set<text> INITCOND {};

次に、次のように使用します。

SELECT uniq(a2) FROM demo2 where b2='sea';

SELECT sum(a3), sum(b3) from demo3 where c3='water' and d3='ocean'

SUMすぐに使用でき、期待どおりに機能します。を参照してくださいsystem.sum

SELECT a1,MAX(b1) FROM demo1 グループ by a1

GROUP BYトリッキーなものです。実際には、結果行を列ごとにグループ化する方法はありません。しかし、できることは、 を作成し、map<text, int>それらを手動でマップにグループ化することです。Christopher Batey のブログの例に基づくと、group-by と max:

CREATE OR REPLACE FUNCTION state_group_and_max(state map<text, int>, type text, amount int)
  CALLED ON NULL INPUT
  RETURNS map<text, int>
  LANGUAGE java AS '
    Integer val = (Integer) state.get(type);
    if (val == null) val = amount; else val = Math.max(val, amount);
    state.put(type, val);
    return state;
  ' ;

CREATE OR REPLACE AGGREGATE state_group_and_max(text, int) 
  SFUNC state_group_and_max
  STYPE map<text, int> 
  INITCOND {};

次に、次のように使用します。

SELECT state_group_and_max(a1, b1) FROM demo1;

ノート

  • 上で述べたように、データ モデリングにはまだいくらかの時間を投資する必要があります。これらの機能を過度に使用しないでください。
  • 機能を有効にするには、で設定enable_user_defined_functions=trueする必要がありますcassandra.yaml
  • 関数をオーバーロードして、異なる型の列によるグループ化をサポートできます。

参考文献:

于 2015-10-19T20:55:40.073 に答える