2012-09-26 11 views
7

Tengo un archivo de texto enorme de la formahallazgo significa el uso de cerdo o hadoop

datos se guardan en los datos del directorio/data1.txt, data2.txt y así sucesivamente

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

Lo que yo quiero hacer es para cada comerciante, encuentre la cantidad promedio ..

así que, básicamente, al final quiero guardar la salida en el archivo. algo así como

merchant_id, average_amount 
    1234, avg_amt_1234 a 
    and so on. 

¿Cómo se calcula la desviación estándar, así?

Lo siento por hacer una pregunta tan básica. :( Cualquier ayuda sería apreciada :)

+0

Una buena respuesta a esta pregunta debería cubrir los conceptos básicos de hadoop, así como los algoritmos necesarios para calcular las diversas métricas.Me gustaría volver a editar esta pregunta, o tal vez preguntar a otro y decir por adelantado lo que sabes sobre cómo resolver esto con hadoop o cerdo y ser más específico sobre la única cosa que te está reteniendo. –

Respuesta

12

Apache PIG está bien adaptado para tales tareas. Ver ejemplo:

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; 
}; 

Prestar especial atención al tipo de datos de la columna de amnt ya que influirá en el que la ejecución de la función SUMA PIG se va a invocar.

PIG también puede hacer algo que SQL no puede, puede poner la media en cada fila de entrada sin utilizar ninguna unión interna. Eso es útil si está calculando puntajes z usando la desviación estándar.

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

FLATTEN (inpt) hace el truco, ahora se tiene acceso a la cantidad original que había contribuido a los grupos promedio, suma y contar.

ACTUALIZACIÓN 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; 

Utilizará 2 puestos de trabajo. No he descubierto cómo hacerlo en uno, mmm, necesito dedicarle más tiempo.

+0

¿cómo calculo la desviación estándar? – Fraz

+0

ver ACTUALIZACIÓN 1 .... – alexeipab

+0

¿hay alguna posibilidad de que el valor de la suma desborde? Estoy tratando de implementar algo como esto, pero me preocupa el desbordamiento. – siddardha

1

¿Qué quieres? ¿Desea el código Java en ejecución o el proceso abstracto de reducción de mapa? Por segundo:

El mapa paso:

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

La reducir el paso:

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

Al igual que en el paso de reducir, se le proporcionará una corriente de grabación que tiene la misma clave y puedes hacer casi todo lo que puedas, incluido el promedio, la varianza.

1

puede calcular la desviación estándar en un solo paso; usando la fórmula

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; 
}; 

eso es todo!

+0

Por favor, considere mejorar el formato de su respuesta junto con alguna descripción. –