これは古い質問ですが、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
- 関数をオーバーロードして、異なる型の列によるグループ化をサポートできます。
参考文献: