2010-05-21 3 views
9

Ciao a tutti, appena iniziato su Hadoop e curioso quello che il modo migliore di MapReduce sarebbe quello di contare i visitatori unici, se i tuoi file di log si presentava così ...Qual è il modo migliore per contare i visitatori unici con 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 

e per ogni sito si voleva scoprire la visitatori unici per ogni sito?

Stavo pensando che il mapper emetterebbe siteID \ t nome utente e il riduttore manterrebbe un set() degli unici nomi utente per chiave e quindi emetterà la lunghezza di quel set. Tuttavia, ciò potrebbe potenzialmente memorizzare milioni di nomi utente in memoria che non sembrano giusti. Qualcuno ha un modo migliore?

che sto utilizzando lo streaming di pitone per la via

grazie

risposta

3

Si potrebbe fare come un'operazione a 2 stadi:

Primo passo, emettono (username => siteID), e hanno il riduttore appena comprimere multipla occorrenze di siteID utilizzando un set - poiché in genere i siti sono molto meno di quelli degli utenti, questo dovrebbe andare bene.

Quindi, nel secondo passaggio, è possibile emettere (siteID => username) e fare un conteggio semplice, poiché i duplicati sono stati rimossi.

1

Utilizzare l'ordinamento secondario per ordinare l'id utente. In questo modo, non è necessario avere nulla in memoria: basta scorrere i dati e incrementare il contatore distinto ogni volta che si visualizza il valore modificato per un determinato ID sito.

Ecco alcuni documentation.

1

mio aproach è simile a quello che tzaman ha dato con una piccola torsione

  1. mappa di output: (nome utente, siteid) => ("")
  2. ridurre la produzione: (siteid) => (1)
  3. mappa: mapper identità
  4. ridurre: longsumreducer (cioè semplicemente riassumere)

Si noti che il primo a ridurre non ha bisogno di andare oltre qualsiasi delle r viene presentato ecords. Puoi semplicemente esaminare la chiave e produrre l'output.

HTH