2016-11-10 6 views
1

私は次の表を持っています。単一のCQL選択で各ユーザのフォロワーの数を得ることは可能ですか?各ユーザーのフォロワーの数を取得

create table user_follows (name text, follows_name text, primary key (name,follows_name)); 

name | follows_name 
---------+-------------- 
indrani |  aravind 
indrani |  jorge 
indrani |  lalitha 
indrani |  vijay 
    vijay |  aravind 
    vijay |  david 
    vijay |   mark 
    filmon |  david 
    filmon |  jorge 
    filmon |  kishore 
    filmon |  lalitha 
    filmon |   mark 
    filmon |  vijay 
    david |  aravind 
    david |   mark 

私は正確にコードを見ることなく伝えることができないが、これは役立つかもしれない単一のユーザー

select count(follows_name) from user_follows where name='indrani'; 

答えて

1

これはサポートされていません。あなたができる唯一のことは、すべてのパーティションに対してCOUNT(*)クエリを発行することです。

あなたのパーティションを知らない場合は、各パーティション(パーティション内のデータがクラスタキーによって順序付けされる)のための最初のレコード(したがって、パーティションキー)を取得するためにPER PARTITION LIMIT 1を使用することができます。

SELECT name FROM user_follows PER PARTITION LIMIT 1; 

これには、Cassandra 3.6以降が必要です。

しかし、これについてもっと考えてみると、COUNTクエリ(パーティションによって制限されるWHERE)は、C *がレコードを数える方法であるため、パーティションのスキャンを生成します。すべてのパーティションに対してこのクエリを発行すると、すべてのデータセットがスキャンされ、おそらくクラスタが終了します。

あなたはユーザーごとにカウンタをデクリメント/同じパーティションキーと増加してカウンターテーブルを作成することができ正確する必要がない場合:

CREATE TABLE user_follows_counts (
    name text PRIMARY KEY, 
    followers counter, 
); 

今、あなたが取得したいですあなたがはるかに効率的なクエリを使用して、データセットをスキャンせずに欲しいもの:

SELECT * FROM user_follows_counts; 

チェック詳細についてはcountersのドキュメント。

-1

なぜ

Select COUNT(*) FROM table_name WHERE name='indrani' 

のカウントを返す次のクエリを持っています。

+0

これは私が現在行っているもので、私は質問の一部として投稿しました。 –

0

これは、cassandraでカスタムUDFを使用する場合にのみ可能です。 RDBMSの世界では、このための

理想のクエリは

Select name, COUNT(*) FROM table_name GROUP BY name; 

だろう。しかし、これは直接カサンドラではサポートされていないため、あなたの代わりに地図を使用して、グループにカスタムUDF書き込むことができます。

https://stackoverflow.com/a/33223749/2990458

+0

これはすべてのデータセットをスキャンします。代わりに、専用のテーブルが最適なソリューションであり、優れたマージンがあります。 – xmas79

+0

@ xmas79あなたは正しいです。しかし、私はそれが依存するか、クエリの頻度を書いて読み込むと思います。このクエリが実行され、sheldomが実行され、user_followsテーブルで更新/削除が頻繁に行われると、カウンタが過剰になる可能性があります。あなたのソリューションの周りの他の方法は正常に動作します。 –

関連する問題