47

有没有办法在 Cassandra 中获取单个列族的行数(键数)?get_count 只能用于获取列数。

例如,如果我有一个包含用户的列族并且想要获取用户数。我怎么能做到?每个用户都是它自己的行。

4

6 回答 6

39

如果您正在处理大型数据集并且可以使用非常好的近似值,我强烈建议您使用以下命令:

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

“键数(估计)”行是整个集群的一个很好的猜测,并且性能比显式计数方法快得多。

于 2013-01-21T21:04:19.870 回答
6

我在这里找到了一篇很好的文章.. http://www.planetcassandra.org/blog/post/counting-keys-in-cassandra

从 cf 限制 1000000 中选择计数(*)

如果我们事先知道一个近似的上限,则可以使用上述语句。我发现这对我的情况很有用。

于 2013-05-28T11:41:51.480 回答
6

如果您使用的是保序分区器,则可以使用 get_range_slice 或 get_key_range 来执行此操作。

如果不是,则需要将用户 ID 存储在特殊行中。

于 2009-12-23T15:05:43.937 回答
2

[编辑:这个答案在 Cassandra 0.8.1 时已经过时了——请参阅 Cassandra Wiki 中的Counters 条目,了解在 Cassandra 中处理计数器列的正确方法。]

我是 Cassandra 的新手,但我在 Google 的 App Engine 上搞砸了很多。如果没有其他解决方案出现,您可以考虑在支持原子增量操作(如 memcached)的平台中保留一个单独的计数器。我知道 Cassandra 正在开发原子计数器递增/递减功能,但它还没有准备好迎接黄金时段。

我只能发布一个超链接,因为我是新人,因此有关反支持的进展,请参阅下面我评论中的链接。

请注意,此线程建议 ZooKeeper、memcached 和 redis 作为可能的解决方案。我个人的偏好是 memcached。

http://www.mail-archive.com/user@cassandra.apache.org/msg03965.html

于 2010-08-29T21:36:55.193 回答
0

总是有 map/reduce 但这可能不言而喻。如果您使用 hive 或 pig 进行此操作,那么您可以对集群中的任何表执行此操作,尽管我不确定 tasktrackers 是否了解 cassandra 位置,因此它可能必须通过网络流式传输整个表,以便您在 cassandra 上获得任务跟踪器节点,但他们收到的数据可能来自另一个 cassandra 节点 :(。我很想听听是否有人确切知道。

注意:我们在 cassandra 上设置 map/reduce 主要是因为如果我们以后想要一个索引,我们可以将一个索引映射/减少到 cassandra。

于 2011-11-14T23:51:55.237 回答
-3

在我将数据转换为 PHP 中的哈希后,我一直得到这样的计数。

于 2009-12-23T14:41:09.673 回答