在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
“Number of Keys(estimate)”这一行是对整个集群的很好的猜测,并且其性能比显式计数方法要快得多。
如果您使用的是保序分区器,则可以使用get_range_slice或get_key_range进行此操作。
如果不是,则需要将用户ID存储在特殊行中。
[编辑:自Cassandra 0.8.1以来,此答案已过时 - 请参见Cassandra Wiki中的计数器条目以了解在Cassandra中处理计数器列的正确方法。]
我对Cassandra还很陌生,但我已经在Google的App Engine上进行了很多尝试。如果没有其他解决方案,您可以考虑在支持原子递增操作的平台(如memcached)中保留单独的计数器。 我知道Cassandra正在开发原子计数器递增/递减功能,但它还没有准备好面向主流。
由于我是新手,因此只能发布一个超链接,请参见我的下面评论中的链接以获取有关计数器支持进展的信息。
请注意,此线程建议ZooKeeper、memcached和redis作为可能的解决方案。 我个人更喜欢memcached。
http://www.mail-archive.com/user@cassandra.apache.org/msg03965.html
通常都会使用map/reduce,但这可能是不言自明的。如果你在hive或pig中使用它,那么你可以对集群中的任何表执行操作,尽管我不确定tasktracker是否知道cassandra的本地性,因此它可能必须在网络上流式传输整个表,以便你在cassandra节点上获取tasktracker,但它们接收到的数据可能来自另一个cassandra节点:(。如果有人确切知道,请告诉我。
注意:我们主要在cassandra上设置map/reduce,因为如果以后需要索引,我们可以将其映射/减少到cassandra中。
在 PHP 中将数据转换为哈希后,我一直像这样获取计数。