Вычисление уникальных элементов из огромного списка в Google App Engine - PullRequest
1 голос
/ 06 апреля 2011

Я получил веб-виджет с 15 000 000 посещений в месяц, и я регистрирую каждую сессию. Когда я хочу создать отчет, я хотел бы знать, сколько существует уникальных IP-адресов. В обычном SQL это было бы просто, как я бы просто сделал:

SELECT COUNT(*) FROM (SELECT DISTINCT IP FROM SESSIONS)

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

Решением, о котором я думал, было создание пустой таблицы Unique-IP, а затем задание MapReduce для прохождения всех сущностей сеанса, если IP-адрес сущности отсутствует в таблице, я добавлю его и добавлю один к счетчик. Тогда у меня была бы другая работа MapReduce, которая очистила бы стол. Это было бы сумасшествием? Если так, как бы вы это сделали?

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Подход mapreduce, который вы предлагаете, именно то, что вы хотите Не забудьте использовать транзакции для обновления записи в задаче очереди задач, что позволит вам запускать ее параллельно со многими сопоставителями.

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

1 голос
/ 06 апреля 2011

Если время не имеет значения, и вы можете попробовать задание задачи с пределом задачи 1. В основном вы будете использовать рекурсивное задание, которое запрашивает пакет записей журнала, пока оно не достигнет DeadlineExceededError. Затем вы записываете результаты в хранилище данных, и задача ставится в очередь с указателем конца запроса / значением ключа последней записи, чтобы начать операцию выборки, где она остановилась в прошлый раз.

...