/ / Unir dos archivos en el mismo directorio usando hadoop - join, hadoop, mapreduce, hdfs, file-Processing

Uniendo dos archivos en el mismo directorio usando hadoop - join, hadoop, mapreduce, hdfs, procesamiento de archivos

Soy un hadoop total n00b. Estoy tratando de resolver lo siguiente como mi primer proyecto hadoop. Tengo más de un millón de subcarpetas en un cubo de Amazon S3. Cada una de estas carpetas tiene dos archivos. El archivo 1 tiene datos de la siguiente manera:

date,purchaseItem,purchaseAmount
01/01/2012,Car,12000
01/02/2012,Coffee,4
....................

File2 tiene la información del cliente en el siguiente formato:

ClientId:Id1
ClientName:"SomeName"
ClientAge:"SomeAge"

Este mismo patrón se repite en todas las carpetas del depósito.

Antes de escribir todos estos datos en HDFS, quiero unir File1 y File2 de la siguiente manera:

Archivo unido:

ClientId,ClientName,ClientAge,date,purchaseItem,purchaseAmount
Id1,"SomeName","SomeAge",01/01/2012,Car,12000
Id1,"SomeName","SomeAge",01/02/2012,Coffee,4

Necesito hacer esto para cada carpeta yluego alimente este conjunto de datos unido a HDFS. ¿Alguien puede señalar cómo podría lograr algo así en Hadoop? Un empujón en la dirección correcta será muy apreciado.

Respuestas

3 para la respuesta № 1

Lo que viene a la mente rápidamente es una implementación en cascada.

Encuentre una manera de convertir sus filas en columnas para File2 mediante programación para que pueda iterar sobre todas las carpetas y transponer el archivo de modo que su primera columna sea su primera fila.

Para solo una subcarpeta: Quizás estableciendo dos esquemas a TextDelimited Esquema para el archivo 1 y a TextLine Esquema para el archivo 2. Configúrelos como Taps luego envuelva cada uno de estos en un MultiSourceTap esto concatena todos esos archivos en uno Pipe.

En este punto deberías tener dos separados MultiSourceTaps uno para todos los File1 (s) y uno para todos losArchivo2 (s). Tenga en cuenta algunos de los detalles entre aquí, puede ser mejor configurar esto para una subcarpeta y luego iterar sobre el otro millón de subcarpetas y enviar a otra área y luego usar hadoop fs -getmerge para obtener todos los archivos pequeños de salida en uno grande.

Siguiendo con el tema en cascada, entonces podría construir Pipes para agregar el nombre de la subcarpeta usando new Insert(subfolder_name) por dentro y Each funcionen para que ambos conjuntos de datos tengan una referencia a la subcarpeta de la que proviene para unirlos y luego ... Unirlos usando cascada CoGroup o Hive-QL Join.

Puede haber una implementación mucho más fácil que esto, pero esto es lo que se me ocurre pensar rápidamente. :)

TextDelimited, TextLine, MultiSourceTap


0 para la respuesta № 2

Eche un vistazo al CombineFileInputFormat.