Cassandraの単一列ファミリーの行カウント(キーカウント)を取得する方法はありますか? get_countは、列数を取得するためにのみ使用できます。
たとえば、ユーザーを含む列ファミリがあり、ユーザー数を取得したい場合。どうすればいいですか?各ユーザーは独自の行です。
大規模なデータセットで作業していて、かなり良い近似値で問題ない場合は、次のコマンドを使用することを強くお勧めします。
nodetool --Host <hostname> cfstats
これにより、各列ファミリのリストが次のようにダンプされます。
Column Family: widgets
SSTable count: 11
Space used (live): 4295810363
Space used (total): 4295810363
Number of Keys (estimate): 9709824
Memtable Columns Count: 99008
Memtable Data Size: 150297312
Memtable Switch Count: 434
Read Count: 9716802
Read Latency: 0.036 ms.
Write Count: 9716806
Write Latency: 0.024 ms.
Pending Tasks: 0
Bloom Filter False Postives: 10428
Bloom Filter False Ratio: 1.00000
Bloom Filter Space Used: 18216448
Compacted row minimum size: 771
Compacted row maximum size: 263210
Compacted row mean size: 1634
「キーの数(推定)」行はクラスター全体で適切な推測であり、パフォーマンスは明示的なカウントアプローチよりもはるかに高速です。
順序を維持するパーティショナーを使用している場合、get_range_sliceまたはget_key_rangeを使用してこれを行うことができます。
そうでない場合は、ユーザーIDを特別な行に保存する必要があります。
これに関する素晴らしい記事をここで見つけました。 http://www.planetcassandra.org/blog/post/counting-keys-in-cassandra
cf limit 1000000からcount(*)を選択します
上記のステートメントは、事前に既知の近似上限がある場合に使用できます。私はこれが私の場合に役立つと思いました。
[編集:この回答はCassandra 0.8.1の時点で古くなっています-Cassandraの Counters entry Cassandraでカウンター列を処理する正しい方法については、Wikiをご覧ください。]
私はCassandraを初めて使用しますが、GoogleのApp Engineをめちゃくちゃにしています。他のソリューションが存在しない場合は、memcachedなどのアトミックインクリメント操作をサポートするプラットフォームに別のカウンターを保持することを検討できます。 Cassandra=はアトミックカウンターのインクリメント/デクリメント機能に取り組んでいますが、プライムタイムにはまだ準備ができていません。
私は新しいので1つのハイパーリンクしか投稿できません。そのため、カウンターサポートの進捗状況については、以下のコメントのリンクを参照してください。
このスレッドは、可能なソリューションとしてZooKeeper、memcached、およびredisを提案していることに注意してください。私の個人的な好みはmemcachedです。
常にmap/reduceがありますが、それはおそらく言うまでもないでしょう。 Hiveまたはpigでそれを持っている場合、クラスタ全体の任意のテーブルに対してそれを行うことができますが、タスクトラッカーはcassandra局所性について知っているので、テーブル全体をストリーミングする必要があるかもしれませんcassandra=ノードでタスクトラッカーを取得しますが、受信するデータは別のcassandra node :(。確かに。
注:cassandraでmap/reduceを設定しています。主に、後でインデックスが必要な場合、それをcassandraにmap/reduceできるためです。