2012-04-28 16 views
9

Me gustaría realizar la operación costosa de productos cruzados en dos conjuntos de datos en Hadoop utilizando Java MapReduce.Producto cruzado en MapReduce

Por ejemplo, tengo registros del conjunto de datos A y del conjunto de datos B, y me gustaría que cada registro en el conjunto de datos A coincida con cada registro en el conjunto de datos B en la salida. Me doy cuenta de que el tamaño de salida de esto sería |A| * |B|, pero quiero hacerlo de todos modos.

Veo que Pig tiene CROSS pero no estoy al tanto de cómo se implementa en un alto nivel. Tal vez iré a echar un vistazo al código fuente.

No busco ningún código, solo quiero saber a un alto nivel cómo debería abordar este problema.

+0

¿Puede colocar todas las A, o todas las B, en la memoria de un trabajador? Entonces es bastante sencillo. –

+0

@SeanOwen ¡Deseo! Desafortunadamente, este no es el caso. Un enfoque que estaba pensando fue dividir el conjunto de datos B en ~ 10-100 o más, y luego ejecutar 10-100 trabajos diferentes de mr a la vez. –

Respuesta

3

He hecho algo similar al mirar la similitud del documento (comparando un documento con cualquier otro documento) y terminé con un formato de entrada personalizado que divide los dos conjuntos de datos y luego aseguró que había una "división" para cada subconjunto de datos.

Así que sus divisiones se vería así (cada una fusión de dos series de 10 registros, para producir 100 registros)

A(1-10) x B(1-10) 
A(11-20) x B(1-10) 
A(21-30) x B(1-10) 
A(1-10) x B(11-20) 
A(11-20) x B(11-20) 
A(21-30) x B(11-20) 
A(1-10) x B(21-30) 
A(11-20) x B(21-30) 
A(21-30) x B(21-30) 

No recuerdo cómo performant era, sin embargo, pero tenía un juego de documentos en el orden de tamaño de miles para comparar entre sí (en un cluster de desarrollo de 8 nodos), con millones de productos cruzados calculados.

También podría hacer mejoras en el algoritmo, ya que algunos documentos nunca se anotarán bien contra otros (si tienen demasiado tiempo temporal entre ellos, por ejemplo) y generarán mejores divisiones como resultado.

+0

Esto es fantástico. Muy limpio ya que todo el emparejamiento se hace con el formato de entrada. ¡Gracias! –

+0

@Chris Eso es un enfoque maravilloso. Me preguntaba si puedes compartir cómo escribiste "formato de entrada personalizado" o puede ser código. Eso sería útil. –

+0

@justinwaugh - Veré si puedo descubrir algo y escribir una publicación en el blog, me aseguraré de vincularlo aquí –