lunes, abril 28, 2014

Escribiendo scripts en Apache Pig para Hadoop

Descargando y ejecutando Pig en modo local

Si aún no has hecho el primero de los tutoriales sobre Pig, te recomiendo pasarte por él ya que va a ser el mínimo necesario para que puedas realizar este tutorial: Primeros pasos con Apache Pig. Usando Pig para hacer un contador de palabras

Descripción breve de un script Pig

Un script Pig no es mas que una serie de órdenes ejecutadas secuencialmente para realizar una consulta. Es exactamente lo mismo que utilizar la consola sólo que además le puedes poner comentarios. La manera de escribir comentarios en el código Pig es precediendo las líneas con un doble guión (--) o para hacerlo multilínea sería con el típico /* */

El contador de palabras en un script Pig

Para hacer el contador de palabras en un script Pig, lo único que tenemos que hacer es crear un fichero con la extensión pig e introducir las órdenes que utilizamos en el tutorial anterior sobre Pig en el fichero. Vamos a crear un fichero llamado wordcounter.pig y dentro escribiremos lo siguiente:

/* Cargar el fichero */
myfile = LOAD 'tweets' AS (words:chararray);

/* Separar las palabras dentro de cada linea */
wordsList = FOREACH myfile GENERATE TOKENIZE($0);

/* Separar las palabras a una linea por palabra */
words = FOREACH wordsList GENERATE FLATTEN($0);       

/* Agrupar las palabras iguales en la misma linea */
groupedWords = GROUP words BY $0;

/* Contar las palabras */
final = FOREACH groupedWords GENERATE $0, COUNT($1);  

/* Ordenar las palabras */
sortedWords = ORDER final BY $1 ASC;

/* Mostrar los resultados por pantalla */
DUMP sortedWords;


Ahora, para ejecutar el script en modo local, sólo tenemos que escribir:
pig -x local wordcounter.pig

Bonus: Guardando los resultados en un archivo

En la mayoría de los casos no vamos a querer mostar los resultados por pantalla sino que vamos a querer que los resultados se guarden en disco para su posterior análisis. Nada mas fácil en Pig. Lo único que tenemos que hacer es reemplazar la instrucción DUMP con la instrucción STORE. El código nos quedaría así:


/* Cargar el fichero */
myfile = LOAD 'tweets' AS (words:chararray);

/* Separar las palabras dentro de cada linea */
wordsList = FOREACH myfile GENERATE TOKENIZE($0);

/* Separar las palabras a una linea por palabra */
words = FOREACH wordsList GENERATE FLATTEN($0);       

/* Agrupar las palabras iguales en la misma linea */
groupedWords = GROUP words BY $0;

/* Contar las palabras */
final = FOREACH groupedWords GENERATE $0, COUNT($1);  

/* Ordenar las palabras */
sortedWords = ORDER final BY $1 ASC;

/* Guardar los resultados en una carpeta llamada pig_wordcount */
STORE sortedWords into 'pig_wordcount';


Esto creará una carpeta llamada "pig_wordcount" que contendrá los resultados de la consulta en archivos con un formato "part-r-*". Para ver los resultados sólo habrá que ejecutar desde el bash:
cat pig_wordcount/part-r-*