Puntos clave: Apache Pig simplifica el procesamiento de datos en Hadoop con una sintaxis similar a SQL para operaciones de MapReduce, utilizando estructuras de datos como tuplas y bolsas para una manipulación intuitiva.
- Desarrollado por Yahoo para agilizar el procesamiento de datos de Hadoop.
- Las operaciones clave incluyen LOAD, GROUP y FOREACH para un manejo eficaz de los datos.
Cerdo apache 101
Apache Pig, desarrollado en Yahoo, fue escrito para Haz más fácil de trabajar con Hadoop. Hadoop fue desarrollado por Google. Pig permite a los programadores trabajar con conjuntos de datos de Hadoop usando una sintaxis que están similar a SQL. Sin Pig, los programadores más comúnmente utiliza Java, el lenguaje en el que están escribe Hadoop. Pero el código Java están intrínsecamente extenso. Sería mejor tener una forma más fácil y mucho más corta de realizar operaciones Hadoop MapReduce. Eso están lo que hace Pig.
Pero Pig no están exactamente SQL. De hecho, los programadores SQL encontrarán algunas de sus estructuras de datos un poco extrañas.
Los datos en Pig están representados en estructuras de datos llamadas tuplas, siendo todas las demás estructuras de datos de Pig alguna variación de ellas. En su forma más básica, una tupla están un conjunto de valores delimitado por comas:
(1,2,3,4,5)
(1,6,7,8,9)
Y cuando te une dos tuplas, en este caso en el primer elemento, representa los datos así:
O esto:
(1,2,3,4,5,1,6,7,8,9)
O esto:
(1, {(1,2,3,4,5), (1,2,3,4,5)})
En el primer caso, Pig ha unido todos los elementos de dos tuplas en uno. En el segundo, ha puesto los criterios de unión en el primer elemento y ha creado una bolsa en el segundo. Una bolsa es una colección de tuplas. Y los elementos individuales son llamados átomos. Pig también soporta mapas en el formato (clave#valor).
Estas estructuras extrañas dejan al programador rascándose la cabeza preguntándose cómo deshacer todo eso para poder consultar átomos individuales. Explicamos algunas de esas operaciones a continuación.
Usar Pig y cómo funciona
Lo que hace Pig están ejecutar operaciones de MapReduce entre conjuntos de datos. MapReduce están el concepto fundamental detrás de Hadoop y del big data en general. Pero significa algo bastante diferente en Hadoop que, por ejemplo, Apache Spark o el lenguaje de programación Scala. En Hadoop, la operación de mapeo significa separar conjuntos de datos en partes y trabajar en ellas en paralelo. Reduce significa juntarlos todos para entregar el conjunto de datos deseado. En Spark y Scala, map significa ejecutar alguna operación en cada elemento de una lista. Reduce significa calcular un valor único final de esas operaciones en Spark.
te Comienza Cerdo en modelo local usando:
pig -x local
En lugar de solo Pig:
pig
Lo que hace que se ejecute en modo clúster (también conocido como mapReduce). El modelo local simula una arquitectura distribuida. En modo clúster, mapReduce utiliza Apache Yarn para ejecutar trabajos en el clúster (es decir, una red de máquinas) y almacena los datos resultantes en HDFS (Hadoop Distributed File System).
Errores comunes
Pig, te podrías decir que tiene algunas peculiaridades que dificultan depurar errores, además de que las personas que mantienen Pig cambian ligeramente el lenguaje. Normalmente no da mensajes de error simples, pero en la mayoría de los casos muestra un rastreo largo y difícil de leer de la pila Java. (Los guardará como un archivo tmp* en el directorio actual.) Así que, antes de Comienza a ver algunos ejemplos de código, veamos algunos errores comunes que podrían causarte problemas y frustración desde el principio:
- te necesitas comprobar en qué puerto están ejecutando HDFS para poder abrir los archivos allí. Mira $HADOOP_HOME/etc/hadoop/core-site.xml para fs.default.namehdfs://localhost:9000 para Obtén el número de puerto.
- Ten cuidado al copiar y pegar las comillas y las izquierdas de Google Docs u otro procesador de texto en la carcasa de Pig. Pig lanzará un error a menos que te utiliza la comilla única correcta (ASCII 27).
- O bien ejecutas Pig como root o dedicas tiempo a resolver problemas de permisos.
- No utilices (control)(-c-) cuando te escribas un comando incompleto porque pide más entrada. Eso saldrá del shell. Solo escribe "" o ";" hasta que cierre el comando actual. A veces eso puede requerir varios intentos.
- Escribe comandos en un editor de texto y pégalos en Pig, ya que Pig no te permite editar comandos anteriores fácilmente. Por ejemplo, no tú no puedes usar el cursor hacia arriba y luego editar la línea anterior si se envuelve alrededor. Tú puedes Ve el historial de comandos escribiendo historial.
- Si te has cargado Hadoop y Pig en tu portátil, para conoce ejecuta pig en modo local escribiendo pig -x local si te Obtén algún error en java.net.ConnectException. Eso significa que Yarn o algún servicio probablemente no están funcionando o configurado correctamente.
- Aunque llamamos fácil a Pig, puede ser frustrante. Por ejemplo, al escribir este documento descubrimos que almacena están una palabra clave reservada y no puede usarse como nombre de columna. Y al redactar el informe de ventas que escribimos abajo, tardamos un tiempo en averiguarlo. Pig no dio ningún mensaje de error amistoso como "almacena están una palabra clave reservada."
Cargar un archivo
Supongamos que tenemos un archivo de datos sales.csv así, con ventas por empleado y tienda. (Como acabamos de decir, no podemos utiliza almacena nombre de columna porque están una palabra reservada. Así que utiliza compramos.)
Tienda, empleado, ventas
Dallas,Sam,30000
Dallas,Fred,40000
Dallas,Jane,20000
Houston,Jim,75000
Houston,Bob,65000
New York,Earl,40000
Podemos utilizar Pig para calcular las ventas por tienda. Primero borra la primera línea que contiene la cabecera. Si no, se convertirá en una fila en nuestro conjunto de datos. Luego copia el archivo al sistema de archivos distribuidos de Hadoop así:
hdfs dfs -put sales.csv /user/hadoop/
Ahora lo cargamos en el conjunto de datos a. En Pig, los conjuntos de datos son llamados relaciones. Aquí le decimos que el archivo de entrada está delimitado por comas y asignamos un esquema al conjunto de datos usando AS. También damos los tipos de campo: chararray e int.
a = LOAD 'hdfs://localhost:9000/user/hadoop/sales.csv' USING PigStorage(',') AS (shop:chararray,employee:chararray,sales:int);
Luego tenemos esta tupla que podemos Ve escribiendo:
dump a
(Dallas,Sam,30000)
(Dallas,Fred,40000)
(Dallas,Jane,20000)
(Houston,Jim,75000)
(Houston,Bob,65000)
(New York,Earl,40000)
Ten en cuenta que podríamos haber omitido el esquema en la relación. En ese caso, te referirías a los campos por su posición relativa $0, $1, $2, ... Ten en cuenta también que se está dicho que Pig es perezoso. Eso significa que en realidad no ejecuta la función mapReduce hasta que está necesaria, como imprimir los datos con volcado.
Le pedimos a Pig que nos muestre el esquema del conjunto de datos usando describe:
describe a
a: {shop: chararray,employee: chararray,sales: int}
Ahora agrupamos los datos por taller.
b = GROUP a BY shop;
Luego ejecutamos una operación de grupo, como contar, sumar o promediar:
c = FOREACH b GENERATE group as shop, SUM (a.sales);
Esto nos da el total de ventas por cada tienda:
(Dallas,90000)
(Houston,140000)
(New York,40000)
Fíjate que nos referimos a la columna de ventas como a.ventas incluso después de crear la relación b.
ForEach
Pig permite que te Define funciones definidas por el usuario (UDF) ejecuten sobre elementos de una tupla en la construcción FOREACH. te puede programarlas en Pig, Python, Ruby u otro. Y te puede utiliza las llamadas funciones de hucha que otras personas han escrito y aportado aquí o utiliza DataFu. Pig no tiene muchas funciones integradas, por eso están la gente son añadiendo las suyas propias.
Pero hace cálculos simples. Por ejemplo, aquí multiplicamos cada cifra de ventas por 2 creando el nuevo conjunto de datos b. Fíjate que también eliminamos una columna y solo tomamos dos campos del conjunto de datos original a para Crea el conjunto de datos b.
b = FOREACH a GENERATE shop,sales*2
Aplanar
Supongamos que cargamos otro conjunto de datos:
a = LOAD 'hdfs://localhost:9000/user/hadoop/election/health.csv' USING PigStorage(',') As (procedure, provider, name, address, city, state, zipcode, stateName, discharges, aveCharges, avePayments, aveMedicarePayments);
Eso tomó ese archivo delimitado por comas y creó esta estructura simple de tuplas.
describe a
a: {procedure: bytearray,provider: bytearray,name: bytearray,address: bytearray,city: bytearray,state: bytearray,zipcode: bytearray,stateName: bytearray,discharges:
bytearray,aveCharges: bytearray,avePayments: bytearray,aveMedicarePayments: bytearray}
Fíjate también que cada campo era de tipo bytearray, lo que están el predeterminado si no te no Define eso explícitamente.
Ahora ejecutamos una función. Ejecutamos la función STRSPLIT que genera dos valores. Aquí le decimos que divida el campo aveCharges por el signo "$" (hex 24). Ese campo están una cadena para la moneda $99999. No podemos hacer cálculos con eso. Así que separamos el signo $. STRSPLIT devuelve una tupla con un campo a la izquierda y otro a la derecha. En este caso, el campo de la izquierda está vacío ya que el signo $ están el primer carácter. Y el campo de la derecha está la parte numérica de la cadena.
b = FOREACH a GENERATE (procedure), STRSPLIT(aveCharges, '\\u0024');
Ahora tenemos una tupla de tuplas, que se están llamada bolsa, más el procedimiento de campo.
dump b
((948 - SIGNS & SYMPTOMS W/O MCC,$34774.21),(,34774.21))
Así que aplanamos la segunda tupla:
c = FOREACH b GENERATE procedure, FLATTEN($1);
Generando esta tupla de elementos, para Haz más fácil de trabajar.
(948 - SIGNS & SYMPTOMS W/O MCC,,15042.00)
Filtro
Volviendo a nuestro conjunto de datos original:
(Dallas,Sam,30000)
(Dallas,Fred,40000)
(Dallas,Jane,20000)
(Houston,Jim,75000)
(Houston,Bob,65000)
New York,Earl,40000)
Solo seleccionamos a empleados que hayan vendido más de 40.000 dólares.
Rendimientos:
x = filter a by sales > 40000
Rendimientos:
(Houston,Jim,75000)
(Houston,Bob,65000)
Join y otras operaciones de conjunto
No están operación de intersección en Pig, pero sí están unirse. También están union, cogroup, cross, union y algunas otras. Aquí, por ejemplo, están cómo funciona join. Supongamos que tenemos una lista de estudiantes y qué asignaturas son cursar y luego una lista de asignaturas y cuánto cuesta cada una.
students = LOAD '/root/Downloads/people.txt' USING PigStorage(',') AS (name,class);
(John,German)
(Jane,German)
(Bob,French)
class = LOAD '/root/Downloads/class.txt' USING PigStorage(',') AS (class,fee);
(German,$100)
(French,$200)
Luego únelas por algún elemento que están común a ambas tuplas.
tuition = join students by class, class by class;
(Bob,French,French,$200)
(Jane,German,German,$100)
(John,German,German,$100)
Eso muestra la clase y el coste todo en una sola estructura.
Tipos de datos
Pig tiene un conjunto pequeño de tipos de datos. Por ejemplo, no tiene un tipo de dato de fecha. En su lugar tenemos float, boolean, double, bag, map, string, int y algunos más. A menudo es necesario convertir un tipo de dato, como este: (int) x, o Define su tipo, así: x:int.
Salvar relaciones
Si te apagar la shell de Pig (te utiliza salir o [-control-][-c-] para hacerlo.) te perder tus conjuntos de datos. Pero guarda el historial para que te puedas recrear tu trabajo. Para guardar tus resultados de forma permanente utiliza:
store x into 'someName
El registro que aparece en la pantalla dirá algo que miente:
Successfully stored 2 records in: "file:///root/Downloads/someName"
Que te puedes ver así:
cat output
Houston Jim 75000
Houston Bob 65000
Que cuando volvemos a cargar en Pig están otra tupla:
(Houston,Jim,75000)
(Houston,Bob,65000)
Así que Pig es una gran herramienta para realizar operaciones ETL (extract, transfer, load) sobre datos Hadoop. Los programas Pig son mucho más cortos que el código Java. Y sus principios básicos no son complicados de aprender. De hecho, la simplicidad está lo que Yahoo buscaba cuando creó el lenguaje para su propio uso interno.
Guía Hadoop
- Tutorial de Hadoop para principiantes: Conceptos básicos de Hadoop
- Introducción a la administración Hadoop
- Introducción a la seguridad Hadoop
- Introducción al Apache Flume
- Una introducción a Hive
- Introducción a HDFS
- Introducción a Hbase
- Ejemplos de Hadoop: 5 casos de utiliza en el mundo real
- Carreras en Hadoop: Conseguir empleo
- Preguntas de entrevista en Hadoop
- Introducción a la analítica Hadoop
- Introducción a Apache Pig
- Introducción al hilo apache
- Introducción a la arquitectura Hadoop
- Ventajas y ventajas de Hadoop
- Usando Hadoop con Apache Cassandra
- Hadoop vs Kubernetes: ¿Acabarán K8s y Cloud Native con Hadoop?
- Certificaciones Hadoop
- Clústeres Hadoop: Una introducción
- Ecosistema y Componentes Hadoop
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.