Как получить количество всех записей заданного типа, хранящихся в хранилище данных Google appengine?

По сути, я ищу этот SQL, переведенный в термины Google AppEngine (для Java):

select count(*) from Customers

Кажется достаточно простым, но, читая документацию, кажется, что мне нужно будет запустить запрос, который соответствует всем Customers, прокрутить его и подсчитать результаты, принимая во внимание пейджинг. Я не хочу извлекать каждый элемент, я просто хочу их подсчитать.

Или, по-другому, был API для перебора всех записей заданного типа (на данный момент не могу найти точный API). Это кажется довольно неэффективным, не говоря уже о том, что вызовы хранилища данных также имеют ограниченную квоту.

Любые подсказки будут оценены.

Спасибо, Марк


person Community    schedule 21.05.2009    source источник


Ответы (5)


Как говорит wooble, bigtable не поддерживает подсчет строк как фундаментальную концепцию — вы можете написать функцию-оболочку, как говорит mcotton, но, как он цитирует из документации, это все равно будет ограничено максимум 1000.

Чтобы преодолеть эти ограничения, вам нужно будет сохранить для каждого типа объекта, который вы хотите подсчитать, счетчик, который увеличивается каждый раз, когда добавляется новый объект этого типа, и уменьшается при удалении объекта этого типа.

Чтобы обеспечить высокую масштабируемость вашего приложения, вы, вероятно, захотите разделить такие счетчики, см. http://code.google.com/appengine/articles/sharding_counters.html (к сожалению, я не знаю о переводе этого рецепта на Java, но концепции должны быть одинаковыми).

person Alex Martelli    schedule 22.05.2009

Как сказал mcotton, похоже, что count() в запросе «SELECT __ key __» без ограничений может делать то, что вы хотите.

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

Однако это относительно новая функция в хранилище данных Google. Раньше у них был обязательный лимит в 1000 на это. Они только недавно сняли это ограничение. Единственным ограничением сейчас является то, выполняется ли ваш запрос достаточно быстро, чтобы не истекло время ожидания.

Есть также новый Google Mapper API, который вы могли бы рассмотреть, если это действительно огромный объем данных, и вы нажимаете тайм-ауты. Чтобы узнать больше об этом, выполните поиск в Google по запросу [appengine mapreduce].

Я согласен, что довольно удивительно, что GQL не поддерживает "SELECT COUNT(*)". Это похоже на некоторую оплошность. Но выполнение выбора только для ключа, а затем использование count(), чтобы не отправлять эти ключи обратно в приложение, должно вести себя аналогично.

person Greg Linden    schedule 19.08.2010

К сожалению, BigTable не может подсчитывать объекты без запуска запросов на соответствие всем им. Имея в виду, что такие приложения, как Google Search и Google Reader, даже не дадут вам точного подсчета результатов, когда у вас их более 1000, если вы абсолютно уверены, что вам нужно подсчитать все ваши сущности, вы можете провести серию keys_only запросы ограничены 1000 объектов каждый и суммируют количество для всех из них.

person Wooble    schedule 21.05.2009

Это просто предположение, но я думаю, что они реализуют метод count() в java, аналогичный их реализации на python. ЗДЕСЬ — это метод count() для Python.

количество (лимит)

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.
person mcotton    schedule 22.05.2009
comment
вернет ли это точный подсчет, когда есть › 1000 результатов? - person Paul Tarjan; 03.06.2009

Это очень старая ветка, но на всякий случай, если она поможет другим людям посмотреть на нее, есть 3 способа сделать это:

  1. Доступ к статистике хранилища данных
  2. Хранение счетчика в хранилище данных
  3. Совместное использование счетчиков

Каждый из этих методов объяснено в этой ссылке.

person svpino    schedule 08.03.2015