GuilleSQL :: Microsoft SQL Server, SSIS, y más !!

Introducción a Pig en Azure HDInsight


Pig es una tegnología que nos permite realizar transformaciones de datos utilizando el lenguaje Pig Latin, para lo cual utiliza resultados intermedios que denomina relaciones (relations), y que podemos extender creando funciones definidas por el usuario (UDF) en lenguajes como Java, C# y Python. Podemos utilizar la interfaz de comandos Grunt desde una sesión SSH (a través del comando pig), para ejecutar sentencias Pig Latin de forma interactiva o como un bloque (batch). Pig es una de las tecnologías que tenemos disponibles al crear un nuevo Cluster Hadoop con Azure HDInsight (Hortonworks).

El concepto de relaciones (relations) en Pig tiene algunos detalles interesantes, que podríamos resumir en los siguientes puntos.

  • Una relación (relation) es un saco (outer bag) de filas. Sería un concepto similar al de una tabla.
  • Una tupla es un conjunto ordenado de campos (fields). Sería un concepto similar a una fila de una tabla.
  • Un campo (field) es un elemento o dato individual. Sería un concepto similar al de un campo de una tabla.
  • Un campo (field) puede contener un conjunto de relaciones en su interios (inner bag). Un concepto similar al de tablas anidadas.
  • Podemos tener tuplas (filas) que no cumplan el esquema de nuestra tabla, por ejemplo porque contengan campos (fields) de más o de menos.

Comandos habituales en Pig Latin

A continuación se muestran los comandos más habituales en Pig Lating:

  • LOAD. Permite cargar un fichero en una relación de Pig.
  • FILTER. Permite filtrar la tuplas (filas) para poder quedarnos sólo con las que necesitamos.
  • FOR EACH … GENERATE. Es bastante común. Permite recorrer todas la tuplas (filas) de una relación existente, para generar una nueva relación en función de los valores en la primera.
  • ORDER. Permite generar una nueva relación ordenada, desde una relación existente.
  • JOIN. Permite unir dos relaciones según un campo común.
  • GROUP. Permite agrupar una relación existente en base a un campo, generando una nueva con una tupla para cada campo, incluyendo en cada fila una tabla interna (inner bag) con los distintos valores encontrados.
  • FLATTEN. Permite generar un relación plana, desde una relación agrupada.
  • LIMIT. Permite limitar el número de tuplas (filas).
  • DUMP. Muestra en pantalla el contenido de una relación existente.
  • STORE. Permite guardar una relación como un fichero en el sistema de ficheros.

Con estos comandos podemos cargar datos, transformarlos, y generar ficheros con resultados conforme a nuestras necesidades, algo que Pig traducirá a Jobs de tipo Map and Reduce, utilizando el motor Tez o el propio MapReduce, para su ejecución en nuestro Cluster Hadoop de Azure HDInsight. A continuación se muestra un ejemplo de código Pig Lating, que podríamos ejecutar de forma interactiva desde la línea de comandos de grunt (con el comando pig).

-- Load a CSV file into a relation with a date and temperatures
Readings = LOAD '/data/weather.txt' USING PigStorage(',') AS (date:chararray, temp:long);

-- Create a new bag by grouping by date the Reading relation
-- I will have a tuple for each group, and within that tuple, all the related temperatures for that date
GroupedReadings = GROUP Readings BY date;

-- Create a new bag having the date as a group, and the average temperature in an inner bag 
GroupedAvgs = FOREACH GroupedReadings GENERATE group, AVG(Readings.temp) AS avgtemp;

-- Generate new flat bag, without groups, having the date and the avg temperature
AvgWeather = FOREACH GroupedAvgs GENERATE FLATTEN(group) as date, avgtemp;

-- Sort the results to make sure they are sorted
SortedResults = ORDER AvgWeather BY date ASC;

-- Store the results in the /weather/summary folder
STORE SortedResults INTO '/data/weather_summary'; 

Introducción a las funciones definidas por el usuario (UDF) en Pig y Hive

Es posibles escribir funciones definidas por el usuario (UDF) en Pig y Hive, como una forma sencilla de extender las posibilidades de Pig y Hive, mucho más fácil que escribir componentes personalizados para MapReduce, pudiendo utilizar diferentes lenguajes como Java, C#, y Python.

Python es quizás el lenguaje más común para estos menesteres. Es un lenguaje sencillo, fácil de aprender, con tipado dinámico, e interpretado (no necesita ser compilado para su ejecución). Quizás el principal detalle a tener en cuenta, es que la indentación del código es muy importante en Python, ya que es la forma en la que se identifican los bloques en código (en lugar de encerrarlos entre llaves), lo que obliga a cuidar la forma de escribir el código (algo que suele facilitar su futura lectura e interpretación). Además, Python viene ya pre-instalado en los Clusters Hadoop de Azure HDInsight.

Pig soporta de forma nativa Jython, una implementación Java del motor de Python, lo que permite escribir fácilmente scripts en Python y ejecutarlos desde Pig utilizando Jython. Así, podemos escribir nuestra UDF siguiendo un formato similar al siguiente (definir el formato de la relación de salida, definir la función, escribir su código, y devolver el resultado):

@outputSchema("result: {(a:chararray, b:int)}")
Def myfunction(i):
   ...
   return a, b

De este modo podemos escribir el código de nuestra UDF en un fichero, para seguidamente utilizarlo desde pig a través de Jython.

REGISTER 'wasb:///scripts/myscript.py' using jython as myscript;
src = LOAD '/data/source' AS (row:chararray);
res = FOREACH src GENERATE myscript.myfunction(row);

Despedida y Cierre

Hasta aquí llega el presente artículo, en el que hemos querido hacer una simple introducción a Pig, dentro de la solución Hadoop de HDInsight, que actualmente es una implementación Hadoop de Hortonworks en formato PaaS de Azure.

Si te ha parecido interesante este artículo, te recomiendo que eches un vistazo al curso  gratuito de EDX DAT202.1x - Processing Big Data with Hadoop in Azure HDInsight, en el que podrás encontrar contenidos y Labs prácticos, además de conocer otras tecnologías relacionadas.

Poco más por hoy. Como siempre, confío que la lectura resulte de interés.

 


[Fecha del Artículo (UTC): 18/02/2018]
[Autor: GuilleSQL]



Escribir un Comentario

Para poder escribir un comentario, debe Iniciar Sesión con un usuario.

Si no dispone de un usuario, puede Registrarse y hacerse miembro.

Si dispone de un usuario, pero no recuerda sus credenciales de acceso, puede Restablecer su Contraseña.

Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  771 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160

Social Networks
Sigue a Portal GuilleSQL en Linkedin !!
Sigue a Portal GuilleSQL en Twitter !!



Archivo

Julio de 2018 (1)
Junio de 2018 (4)
Mayo de 2018 (5)
Abril de 2018 (3)
Marzo de 2018 (2)
Febrero de 2018 (7)
Enero de 2018 (1)
Diciembre de 2017 (15)
Noviembre de 2017 (7)
Junio de 2017 (3)
Mayo de 2017 (1)
Marzo de 2017 (3)
Enero de 2017 (4)
Junio de 2016 (1)
Mayo de 2016 (2)
Abril de 2016 (2)
Septiembre de 2015 (2)
Agosto de 2015 (2)
Junio de 2015 (10)
Mayo de 2015 (4)
Abril de 2015 (8)
Marzo de 2015 (11)
Octubre de 2014 (3)
Septiembre de 2014 (7)
Agosto de 2014 (5)
Julio de 2014 (2)
Mayo de 2014 (4)
Abril de 2014 (4)
Marzo de 2014 (4)
Febrero de 2014 (1)
Enero de 2014 (5)
Diciembre de 2013 (8)
Noviembre de 2013 (2)
Octubre de 2013 (7)
Septiembre de 2013 (6)
Agosto de 2013 (1)
Julio de 2013 (6)
Junio de 2013 (11)
Mayo de 2013 (7)
Abril de 2013 (6)
Febrero de 2013 (5)
Enero de 2013 (7)
Diciembre de 2012 (12)
Noviembre de 2012 (13)
Octubre de 2012 (5)
Septiembre de 2012 (3)
Agosto de 2012 (6)
Julio de 2012 (4)
Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Esta información se proporciona "como está" sin garantías de ninguna clase, y no otorga ningún derecho.
This information is provided "AS IS" with no warranties, and confers no rights.

Copyright © 2007 GuilleSQL, todos los derechos reservados.
GuilleSQL.com y GuilleSQL.net son también parte de Portal GuilleSQL.

Visitas recibidas (Page Loads) en GuilleSQL (fuente: StatCounter):

screen resolution stats
Visitas