2012-09-26 2 views
7

Ho un file di testo enorme della formascoperta significa usare maiale o di Hadoop

dati vengono salvati nei dati di directory/data1.txt, data2.txt e così via

merchant_id, user_id, amount 
1234, 9123, 299.2 
1233, 9199, 203.2 
1234, 0124, 230 
and so on.. 

Quello che voglio fare è per ogni commerciante, trova l'importo medio ..

quindi fondamentalmente alla fine voglio salvare l'output nel file. qualcosa come

merchant_id, average_amount 
    1234, avg_amt_1234 a 
    and so on. 

Come faccio a calcolare la deviazione standard come bene?

Ci scusiamo per la domanda di base. :( Qualsiasi aiuto sarebbe apprezzato. :)

+0

Una buona risposta a questa domanda dovrebbe riguardare le nozioni di base di hadoop e gli algoritmi necessari per calcolare le varie metriche.Vorrei ri-modificare questa domanda, o forse chiedere ad un altro e affermare in anticipo ciò che sai su come risolvere questo problema con hadoop o maiale ed essere più specifico riguardo all'unica cosa che ti sta trattenendo. –

risposta

12

Apache PIG è adatto per tali compiti. Vedi l'esempio:

inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double, id:chararray,c2:chararray); 
grp = group inpt by id; 
mean = foreach grp { 
    sum = SUM(inpt.amnt); 
    count = COUNT(inpt); 
    generate group as id, sum/count as mean, sum as sum, count as count; 
}; 

prestare particolare attenzione al tipo di dati della colonna amnt in quanto influenzerà quale implementazione della funzione PIG SOMMA sta per richiamare.

PIG può anche fare qualcosa che SQL non può, può mettere la media contro ogni riga di input senza utilizzare alcun join interno. Ciò è utile se si calcolano i punteggi z usando la deviazione standard.

mean = foreach grp { 
    sum = SUM(inpt.amnt); 
    count = COUNT(inpt); 
    generate FLATTEN(inpt), sum/count as mean, sum as sum, count as count; 
}; 

appiattire (INPT) fa il trucco, ora si ha accesso alla quantità originale che aveva contribuito ai gruppi media, somma e contare.

UPDATE 1:

Calculating variance and standard deviation:

inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double, id:chararray, c2:chararray); 
grp = group inpt by id; 
mean = foreach grp { 
     sum = SUM(inpt.amnt); 
     count = COUNT(inpt); 
     generate flatten(inpt), sum/count as avg, count as count; 
}; 
tmp = foreach mean { 
    dif = (amnt - avg) * (amnt - avg) ; 
    generate *, dif as dif; 
}; 
grp = group tmp by id; 
standard_tmp = foreach grp generate flatten(tmp), SUM(tmp.dif) as sqr_sum; 
standard = foreach standard_tmp generate *, sqr_sum/count as variance, SQRT(sqr_sum/count) as standard; 

Userà 2 posti di lavoro. Non ho capito come farlo in uno, hmm, ho bisogno di passare più tempo su di esso.

+0

come si calcola la deviazione standard ?? – Fraz

+0

vedi AGGIORNAMENTO 1 .... – alexeipab

+0

ci sono delle possibilità che il valore della somma trabocchi? Sto cercando di implementare qualcosa di simile, ma sono preoccupato per l'overflow. – siddardha

1

Quindi cosa vuoi? Vuoi il codice java in esecuzione o il processo di riduzione della mappa astratta? Per la seconda:

Il passo mappa:

record -> (merchant_id as key, amount as value) 

L'ridurre passo:

(merchant_id, amount) -> (merchant_id, aggregate the value you want) 

Come nella fase di ridurre, vi verrà fornito con un flusso di record di avere la stessa chiave e puoi fare quasi tutto ciò che puoi, compresa la media, varianza.

1

è possibile calcolare la deviazione standard in un solo passaggio; utilizzando la formula

var=E(x^2)-(Ex)^2 
inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double, id:chararray, c2:chararray); 
grp = group inpt by id; 
mean = foreach grp { 
    sum = SUM(inpt.amnt); 
    sum2 = SUM(inpt.amnt**2); 
    count = COUNT(inpt); 
    generate flatten(inpt), sum/count as avg, count as count, sum2/count- (sum/count)**2 as std; 
}; 

questo è tutto!

+0

Per favore, considera di migliorare il formato della tua risposta insieme a qualche descrizione. –