4 votes

JDO sur GoogleAppEngine: Comment compter et regrouper avec BigTable

Je dois collecter des statistiques sur mes entités dans le datastore.

Par exemple, j'ai besoin de connaître le nombre d'objets d'un certain type que j'ai, combien d'objets avec certaines propriétés définies à des valeurs particulières, etc. Dans les SGBDR classiques, je pourrais utiliser

    SELECT COUNT(*) ... WHERE property=

ou

    SELECT MAX(*), ... GROUP BY property

etc. Mais ici je ne peux pas voir aucune de ces structures.

De plus, je ne peux pas charger tous les objets en mémoire (par exemple en utilisant pm.getExtent(MyCall.class, false)) car j'ai trop d'entités (plus de 100k).

Connaissez-vous un moyen d'atteindre mon objectif?

2voto

Igor Artamonov Points 16366

En fait, cela dépend de vos exigences spécifiques.

En passant, il y a une façon commune de préparer ces données statistiques en arrière-plan.

Par exemple, vous pouvez exécuter quelques tâches, en utilisant le service Queue, qui utiliseront une requête comme sélectionner x où x.property == une certaine valeur + curseur + une variable de somme. Si à la première étape, le curseur est vide et la somme est zéro. Ensuite, vous itérez sur le résultat de votre requête, pour 1000 éléments (limite de la requête) ou 9 minutes (limite de la tâche), en incrémentant la somme à chaque étape, et ensuite, si ce n'est pas terminé, appelez cette tâche avec de nouvelles valeurs de curseur et de somme. Je veux dire que vous ajoutez la demande à l'étape suivante dans la file d'attente. Le curseur est facilement sérialisable en chaîne.

Lorsque vous atteignez la dernière étape - vous devez enregistrer la valeur du résultat quelque part dans le tableau des résultats statistiques.

Jetez un œil à:

Et aussi, cette statistique/agrégation dépend vraiment de votre tâche/exigences/projet réel, il y a quelques façons d'accomplir cela, optimal pour différentes tâches. Il n'y a pas de façon standard, comme en SQL

1voto

Kal Points 14230

La prise en charge des fonctions d'agrégation est limitée sur GAE. Cela est principalement dû à la nature sans schéma de BigTable. L'alternative est de maintenir vous-même les fonctions d'agrégation en tant que champs séparés pour y accéder rapidement.

Pour effectuer un comptage, vous pourriez faire quelque chose comme ceci -

Query q = em.createQuery("SELECT count(p) FROM your.package.Class p");
Integer i = (Integer) q.getSingleResult(); 

mais cela vous renverra probablement juste 1000 lignes car GAE limite le nombre de lignes récupérées à 1000.

Quelques lectures utiles sur la façon de contourner ces problèmes -

http://marceloverdijk.blogspot.com/2009/06/google-app-engine-datastore-doubts.html

Y a-t-il un moyen de réaliser des fonctions d'agrégation sur Google App Engine ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X