2009-05-21 6 views
5

Lo que estoy buscando es esencialmente este SQL traducido en Google App Engine (para Java) términos:¿Cómo obtengo un recuento de todas las entradas de un tipo determinado almacenadas en el almacén de datos de appengine de Google?

select count(*) from Customers 

parece bastante simple, pero a partir de la lectura de la documentación, parece que tendría que ejecutar una consulta que coincide con todos los Clientes, repárelo y cuente los resultados, teniendo en cuenta la búsqueda. No quiero recuperar todos y cada uno de los elementos, solo quiero contarlos.

O de otra manera, había una API para recorrer todas las entradas de un tipo determinado (no se puede encontrar la API exacta en este momento). Esto parece ser bastante ineficiente, sin mencionar que las llamadas al almacén de datos también tienen una cuota limitada.

Cualquier sugerencia sería apreciada.

Gracias, Mark

Respuesta

1

Por desgracia, es imposible contar BigTable entidades sin ejecutar consultas para que coincida con todos ellos. Teniendo en cuenta que las aplicaciones como Google Search y Google Reader ni siquiera te darán los recuentos exactos de los resultados cuando tienes más de 1000, si de manera absoluta y positiva crees que debes contar todas tus entidades, podrías hacer una serie de Las consultas de keys_only se limitan a 1000 entidades cada una y suman los recuentos de todas ellas.

0

Esto es solo una especulación, pero creo que implementarán un método count() en java similar a su implementación de python. HERE es el método count() para python.

recuento (límite)

Returns the number of results this query fetches. 

count() is somewhat faster than retrieving all of the data by a constant factor, but the running time still grows with the size of the result set. It's best to only use count() in cases where the count is expected to be small, or specify a limit. 

Note: count() returns a maximum of 1000. If the actual number of entities that match the query criteria exceeds the maximum, count() returns a count of 1000. 

Arguments: 

limit 

    The maximum number of results to count. 
+0

¿devolverá esto un conteo preciso cuando hay> 1000 resultados? –

8

Como dice wooble, Bigtable no admite cuenta de las filas como un concepto fundamental - se puede escribir una función de contenedor, como mcotton dice, pero, como él cita de la documentos, que aún estarán limitados a 1000 como máximo.

Para superar estos límites necesitará mantener, para cada tipo de entidad que desee contar, un contador que se incrementa cada vez que se coloca una nueva entidad de ese tipo, decrementada cuando se elimina una entidad de ese tipo.

Para mantener su aplicación altamente escalable es probable que desee fragmentar dichos contadores, consulte http://code.google.com/appengine/articles/sharding_counters.html (desafortunadamente no conozco una traducción de esa receta a Java, pero los conceptos deben ser los mismos).

3

Como dijo mcotton, parece que count() en una consulta "SELECT __ key __" sin límite puede hacer lo que quiera.

http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_count

Esta es una característica relativamente nueva en el almacén de datos de Google sin embargo. Solían tener un límite requerido de 1000 en esto. Solo recientemente eliminaron ese límite. El único límite ahora es si su consulta se ejecuta lo suficientemente rápido para no agotar el tiempo de espera.

También existe la nueva API de Google Mapper que podría considerar si se trata de una cantidad realmente enorme de datos y si llega al límite de tiempo de espera. Para leer más sobre eso, haga una búsqueda en Google de [appengine mapreduce].

Estoy de acuerdo en que es bastante sorprendente que GQL no sea compatible con "SELECT COUNT (*)". Eso parece un poco de supervisión. Pero hacer un seleccionar solo en la tecla y luego usar count() para no enviar esas teclas todo el camino de vuelta a la aplicación debería comportarse de manera similar.

0

Este es un hilo muy antiguo, pero en caso de que ayuda a otras personas mirarlo, hay 3 maneras de lograr esto:

  1. Acceso a las estadísticas del almacén de datos
  2. Mantener un contador en el almacén de datos
  3. contadores compartir

Cada uno de estos métodos is explained in this link.

Cuestiones relacionadas