JDO в GoogleAppEngine: как считать и группировать с помощью BigTable - PullRequest
4 голосов
/ 15 сентября 2011

Мне нужно собрать статистику по моим сущностям в хранилище данных.

В качестве примера мне нужно знать, сколько у меня таких объектов, как много объектов с некоторыми свойствами, установленными на определенные значения и т. д. В обычных реляционных СУБД я могу использовать

    SELECT COUNT(*) ... WHERE property=<some value>

или

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

и т.д.. Но здесь я не вижу ни одной из этих структур.

Более того, я не могу загрузить все объекты в памяти (например, используя pm.getExtent (MyCall.class, false)), поскольку у меня слишком много сущностей (больше чем 100k).

Знаешь ли ты какой-нибудь трюк для достижения моей цели?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

На самом деле это зависит от ваших конкретных требований.

Кстати, есть общий способ, чтобы подготовить эти данные статистики в фоновом режиме.

Например, вы можете запустить несколько задач, используя службу Queue, которая будет использовать запрос типа select x where x.property == some value + cursor + sum variable.Если вы на первом шаге, курсор будет пустым, а сумма будет равна нулю.Затем вы выполните итерацию результата запроса для 1000 элементов (лимит запроса) или 9 минут (лимит задачи), увеличивая sum на каждом шаге, а затем, если он еще не завершен, вызовите эту задачу с новыми значениями курсора и суммы,Я имею в виду, вы добавляете запрос на следующий шаг в очередь.Курсор легко сериализуется в строку.

Когда вы сделаете последний шаг - вам нужно сохранить значение результата где-нибудь в таблице результатов статистики.

Взгляните на:

А также, эти статистические данные / агрегация действительно зависят от вашей реальной задачи / требований / проекта, есть несколько способовДля этого оптимально под разные задачи.Там нет стандартного способа, как в SQL

1 голос
/ 15 сентября 2011

Поддержка агрегатных функций ограничена в GAE. В первую очередь это артефакт бессхемной природы BigTable. Альтернативой является сохранение агрегатных функций в виде отдельных полей для быстрого доступа к ним.

Для подсчета вы можете сделать что-то вроде этого -

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

, но это, вероятно, вернет вам только 1000 строк, поскольку GAE ограничивает количество выбранных строк до 1000.

Полезное чтение, как обойти эти проблемы -

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

Есть ли способ выполнить агрегатные функции в Google App Engine?

...