有没有办法在Cassandra中获得单个列族的行计数(键计数)? get_count只能用于获取列数。
例如,如果我有一个包含用户的列系列,并希望获得用户数。我怎么能这样做?每个用户都是自己的行。
答案 0 :(得分:38)
如果您正在处理大型数据集并且可以接受相当不错的建议,我强烈建议您使用以下命令:
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
“密钥数量(估计值)”行是群集中的一个很好的猜测,性能比显式计数方法快得多。
答案 1 :(得分:6)
如果您使用的是保留订单的分区程序,则可以使用get_range_slice或get_key_range执行此操作。
如果不是,则需要将用户ID存储在特殊行中。
答案 2 :(得分:5)
我在这里发现了一篇很好的文章.. http://www.planetcassandra.org/blog/post/counting-keys-in-cassandra
从cf limit 1000000
中选择count(*)如果我们手头有一个近似的上限,可以使用上面的语句。我发现这对我的情况很有用。
答案 3 :(得分:2)
[编辑:从Cassandra 0.8.1开始,这个答案已经过时了 - 请参阅Cassandra Wiki中的Counters entry了解Cassandra中处理Counter Columns的正确方法。]
我是Cassandra的新手,但我在Google的App Engine上搞砸了很多东西。如果没有其他解决方案出现,您可以考虑在支持memcached等原子增量操作的平台中保留一个单独的计数器。我知道Cassandra正在研究原子计数器递增/递减功能,但它尚未准备好迎接黄金时段。
我只能发布一个超链接,因为我是新手,所以有关计数器支持的进展,请参阅下面评论中的链接。
请注意,此主题建议将ZooKeeper,memcached和redis作为可能的解决方案。我个人的偏好是memcached。
http://www.mail-archive.com/user@cassandra.apache.org/msg03965.html
答案 4 :(得分:0)
总有map / reduce,但这可能不言而喻。如果您有hive或pig,那么您可以为整个群集中的任何表执行此操作,但我不确定tasktrackers是否了解cassandra位置,因此可能需要在整个网络中传输整个表,以便在cassandra上获取任务跟踪器节点,但他们收到的数据可能是来自另一个cassandra节点:(。我很想知道是否有人确切知道。
注意:我们在cassandra上设置map / reduce主要是因为如果我们以后想要一个索引,我们可以将一个映射/缩减为cassandra。
答案 5 :(得分:-3)
在将数据转换为PHP中的哈希后,我得到了这样的计数。