C'est une question super basique mais elle me dérange depuis des jours. Y a-t-il un bon moyen d'obtenir l'équivalent d'un COUNT(*)
d'une table donnée dans Cassandra?
Je vais transférer plusieurs centaines de millions de lignes dans C * pour des tests de charge et j'aimerais au moins obtenir un décompte de lignes sur des exemples de travaux ETL avant de transférer des quantités énormes de données sur le réseau.
La meilleure idée que j'ai est de faire une boucle sur chaque ligne avec Python et d'incrémenter automatiquement un compteur. Existe-t-il un meilleur moyen de déterminer (ou même d’estimer) la taille des lignes d’un tableau C *? J'ai aussi fouillé dans Datastax Ops Center pour voir si je pouvais déterminer la taille des lignes. Si vous le pouvez, je ne vois pas comment c'est possible.
Quelqu'un d'autre a besoin d'obtenir un count(*)
d'une table en C *? Si oui, comment vous y êtes-vous pris?
Oui, vous pouvez utiliser COUNT(*)
. Voici la documentation .
Une expression SELECT utilisant COUNT (*) renvoie le nombre de lignes correspondant à la requête. Alternativement, vous pouvez utiliser COUNT (1) pour obtenir le même résultat.
Comptez le nombre de lignes dans la table des utilisateurs:
SELECT COUNT(*) FROM users;
Vous pouvez également obtenir des estimations à partir de nodetool cfhistograms
si vous n'avez pas besoin d'un décompte exact (ces valeurs sont des estimations).
Vous pouvez également utiliser spark si vous utilisez DSE.
nodetool tablestats
peut être très pratique pour obtenir rapidement des estimations de rangées (et autres statistiques de table).
nodetool tablestats <keyspace.table>
pour une table spécifique
$nodetool settimeout read 360000
cqlsh -e "SELECT COUNT(*) FROM table;" --request-timeout=3600
Je travaille avec Elasticsearch et cela peut être une réponse à ce problème ... En supposant que vous souhaitiez utiliser Elassandra à la place de Cassandra.
Le système de recherche conserve de nombreuses statistiques et, quelques secondes après les dernières mises à jour, il devrait avoir une bonne idée du nombre de lignes que vous avez dans un tableau.
Voici une requête Match All Query qui vous donne les informations:
curl -XGET \
-H 'Content-Type: application/json' \
"http://127.0.0.1:9200/<search-keyspace>/_search/?pretty=true"
-d '{ "size": 1, "query": { "match_all": {} } }'
Où <search-keyspace>
est un espace de clés créé par Elassandra. Il porte généralement le nom <keyspace>_<table>
. Ainsi, si vous avez un espace de clé nommé foo
et une table nommée bar
dans cet espace de clé, l’URL utilisera .../foo_bar/...
. Si vous voulez obtenir le nombre total de lignes dans toutes vos tables, utilisez simplement /_search/
.
La sortie est un JSON qui ressemble à ceci:
{
"took" : 124,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 519659, <-- this is your number
"max_score" : 1.0,
"hits" : [
{
"_index" : "foo_bar",
"_type" : "content",
"_id" : "cda683e5-d5c7-4769-8e2c-d0a30eca1284",
"_score" : 1.0,
"_source" : {
"date" : "2018-12-29T00:06:27.710Z",
"key" : "cda683e5-d5c7-4769-8e2c-d0a30eca1284"
}
}
]
}
}
Et en termes de vitesse, cela prend des millisecondes, quel que soit le nombre de lignes. J'ai des tables avec plusieurs millions de lignes et cela fonctionne comme un charme. Pas besoin d'attendre des heures ou quelque chose comme ça.
Comme d'autres l'ont mentionné, Elassandra est toujours un système très utilisé en parallèle par de nombreux ordinateurs. Les compteurs changeront rapidement si vous avez beaucoup de mises à jour tout le temps. Ainsi, les chiffres que vous obtenez auprès d’Elasticsearch ne sont corrects que si vous empêchez les mises à jour ultérieures d’être suffisamment longues pour permettre aux compteurs de s’installer. Sinon, le résultat sera toujours approximatif.
Pour ceux qui utilisent l'adaptateur de composants C # Linq, vous pouvez utiliser:
var t = new Table<T>(session);
var count = t.Count().Execute();