эй все, просто начав на hadoop и любопытный, что лучший способ в mapreduce состоял бы в том, чтобы считать уникальными посетителями, если бы Ваши файлы журнала были похожи на это...
DATE siteID action username
05-05-2010 siteA pageview jim
05-05-2010 siteB pageview tom
05-05-2010 siteA pageview jim
05-05-2010 siteB pageview bob
05-05-2010 siteA pageview mike
и для каждого сайта Вы хотели узнать уникальных посетителей к каждому сайту?
Я думал, что картопостроитель испустит имя пользователя siteID \t, и редуктор сохранил бы набор () уникального usersnames на ключ и затем испустил бы длину того набора. Однако это потенциально сохранило бы миллионы имен пользователей в памяти, которая не кажется правильным. У кого-либо есть лучший путь?
Я использую Python, передающий потоком между прочим
спасибо
Вы можете сделать это как двухэтапную операцию:
Первый шаг, испустить (username => siteID)
, и пусть редуктор просто свернет несколько вхождений siteID с использованием набора
- поскольку у вас обычно гораздо меньше сайтов, чем пользователей, этого должно быть нормально.
Затем на втором этапе вы можете отправить (siteID => username)
и произвести простой подсчет, поскольку дубликаты были удалены.
Используйте вторичную сортировку для сортировки по идентификатору пользователя. Таким образом, вам не нужно ничего хранить в памяти - просто передавайте данные и увеличивайте свой отдельный счетчик каждый раз, когда вы видите изменение значения для определенного идентификатора сайта.
Вот некоторая документация .
Мой подход аналогичен тому, что дал tzaman, с небольшим изменением
Обратите внимание, что при первом сокращении не нужно переходить по какой-либо из представленных записей. Вы можете просто изучить ключ и произвести вывод.
HTH