Nombre de lignes d'une famille de colonnes à Cassandra
y a-t-il un moyen d'obtenir un nombre de rangées (nombre de clés) d'une seule famille de colonnes à Cassandra? get_count ne peut être utilisée pour obtenir le nombre de colonnes.
Par exemple, si j'ai une famille de la colonne contenant les utilisateurs et voulait obtenir le nombre d'utilisateurs. Comment pourrais-je le faire? Chaque utilisateur est sa propre ligne.
6 réponses
Si vous travaillez sur un grand ensemble de données, et sont d'accord avec une assez bonne approximation, je recommande fortement d'utiliser la commande:
nodetool --host <hostname> cfstats
ceci videra une liste pour chaque famille de colonnes ressemblant à ceci:
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
la ligne "Nombre de clés (estimation)" est une bonne supposition pour l'ensemble de la grappe et la performance est beaucoup plus rapide que les approches de comptage explicite.
si vous utilisez un partitioner qui préserve l'ordre, vous pouvez le faire avec get_range_slice ou get_key_range.
Si vous n'êtes pas, vous aurez besoin de stocker votre id d'utilisateur dans une ligne spéciale.
j'ai trouvé un excellent article là-dessus.. http://www.planetcassandra.org/blog/post/counting-keys-in-cassandra
select count(*) cf limite 1000000
l'énoncé ci-dessus peut être utilisé si nous avons une limite supérieure approximative connue avant main. J'ai trouvé ça utile pour mon affaire.
[Edit: la réponse est en dehors de la date de Cassandra 0.8.1, veuillez consulter le Compteurs d'entrée dans le wiki de Cassandra pour la façon correcte de manipuler les colonnes de comptoir dans Cassandra.]
Je suis nouveau à Cassandra, mais j'ai beaucoup fait avec le moteur D'application de Google. Si aucune autre solution ne se présente, vous pouvez envisager de garder un compteur séparé dans une plate-forme qui supporte les opérations d'incréments atomiques comme memcached. Je sais que Cassandra travaille sur atomic fonctionnalité de contre-incrément / décrément, mais il n'est pas encore prêt pour le prime time.
Je ne peux poster qu'un lien hypertexte parce que je suis nouveau, donc pour des progrès sur le support compteur voir le lien dans mon commentaire ci-dessous.
notez que ce fil suggère ZooKeeper, memcached, et redis comme solutions possibles. Ma préférence personnelle serait memcached.
http://www.mail-archive.com/user@cassandra.apache.org/msg03965.html
il y a toujours carte / réduire mais cela va probablement sans dire. Si vous avez cela avec la ruche ou le cochon, alors vous pouvez le faire pour n'importe quelle table à travers le cluster même si Je ne suis pas sûr tasktrackers savent au sujet de cassandra localité et il peut donc avoir à diffuser la table entière à travers le réseau afin que vous obtenez des trackers tâche sur les noeuds cassandra, mais les données qu'ils reçoivent peuvent être à partir d'un autre noeud cassandra :(. J'aimerais savoir si quelqu'un sait pour sûr.
NOTE: Nous mettons en place map/reduce sur cassandra principalement parce que si nous voulons un indice plus tard, nous pouvons map/reduce un dans cassandra.
j'ai obtenu les comptes comme ça après avoir converti les données en un hachage en PHP.