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

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

select count(*) from Customers

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

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

Будем благодарны за любые подсказки.

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

Ответы [ 5 ]

8 голосов
/ 22 мая 2009

Как говорит Вубл, bigtable не поддерживает подсчет строк как фундаментальную концепцию - вы можете написать функцию-обертку, как говорит Маккоттон, но, как он цитирует в документах, она все равно будет ограничена максимум 1000.

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

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

3 голосов
/ 20 августа 2010

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

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

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

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

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

1 голос
/ 21 мая 2009

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

0 голосов
/ 08 марта 2015

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

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

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

0 голосов
/ 22 мая 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...