2010-05-21 8 views
9

hej wszystkim, dopiero się rozpoczął na Hadoop i ciekawy, co jest najlepszym sposobem na MapReduce byłoby liczyć unikalnych odwiedzin jeśli logfiles wyglądało to ...Jaki jest najlepszy sposób na liczenie unikalnych użytkowników za pomocą Hadoop?

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 

i dla każdej witryny, którą chciał dowiedzieć się unikalni odwiedzający dla każdej witryny?

Myślałem, że program odwzorowujący będzie generował identyfikator witryny \ t nazwa użytkownika , a reduktor zachowa zbiór() unikalnych nazw użytkowników na klucz, a następnie wyemituje długość tego zestawu. Jednak mogłoby to potencjalnie przechowywać miliony nazw użytkowników w pamięci, co nie wydaje się właściwe. Ktoś ma lepszy sposób?

Używam Pythona strumieniowe przy okazji

dzięki

Odpowiedz

3

Można to zrobić jako operacja 2-etap:

pierwszym etapie emitują (username => siteID), i reduktor prostu zwinąć wielokrotność wystąpienia siteID przy użyciu set - ponieważ zazwyczaj masz o wiele mniej witryn niż użytkowników, powinno to być w porządku.

Następnie w drugim kroku można wyemitować numer (siteID => username) i wykonać prostą liczbę, ponieważ duplikaty zostały usunięte.

1

Sortowanie wtórne służy do sortowania według identyfikatora użytkownika. W ten sposób nie musisz mieć niczego w pamięci - po prostu przesyłaj dane i zwiększaj swój licznik za każdym razem, gdy zobaczysz zmianę wartości dla określonego identyfikatora witryny.

Oto niektóre documentation.

1

Moja aproach jest podobny do tego, co tzaman dał z małym skręcie

  1. wyjście na mapie: (nazwa użytkownika, siteid) => ("")
  2. zmniejszenia produkcji: (siteid) => (1)
  3. mapa: tożsamość odwzorowujący
  4. zmniejszyć: longsumreducer (czyli po prostu podsumować)

Zauważ, że pierwszy zmniejszyć nie musi przejść każdy z R ekshibicje są prezentowane. Możesz po prostu sprawdzić klucz i wygenerować wynik.

HTH