Apache Pig UDF: Parte 1 - Funciones de evaluación, agregación y filtro



Esta publicación describe sobre Apache Pig UDF: funciones de evaluación, agregación y filtro. Eche un vistazo a las funciones de evaluación, agregación y filtro.

Apache Pig proporciona un amplio soporte para funciones definidas por el usuario (UDF) como una forma de especificar el procesamiento personalizado. Las UDF de Pig se pueden ejecutar actualmente en tres idiomas: Java, Python, JavaScript y Ruby. Se proporciona el soporte más amplio para las funciones de Java.





Las UDF de Java se pueden invocar de varias formas. La UDF más simple puede simplemente extender EvalFunc, que requiere que solo se implemente la función exec. Cada Eval UDF debe implementar esto. Además, si una función es algebraica, puede implementar una interfaz algebraica para mejorar significativamente el rendimiento de las consultas.

Importancia de las UDF en el cerdo:

Pig permite a los usuarios combinar operadores existentes con su propio código o el de otros a través de UDF. La ventaja de Pig es su capacidad para permitir que los usuarios combinen sus operadores con su propio código o el de otros a través de UDF. Hasta la versión 0.7, todas las UDF deben estar escritas en Java y se implementan como clases de Java. Esto hace que sea más fácil agregar nuevas UDF a Pig escribiendo una clase Java e informando a Pig sobre el archivo JAR.



El cerdo en sí viene con algunas UDF. Antes de la versión 0.8, era un conjunto muy limitado con solo las funciones agregadas estándar de SQL y algunas otras. En 0.8, se agregaron una gran cantidad de UDF estándar de procesamiento de cadenas, matemáticas y de tipo complejo.

¿Qué es una alcancía?

Piggybank es una colección de UDF aportadas por los usuarios que se publica junto con Pig. Las UDF de Piggybank no están incluidas en Pig JAR, por lo que debe registrarlas manualmente en su script. También puede escribir sus propias UDF o utilizar las escritas por otros usuarios.

Funciones de evaluación

La clase UDF extiende la clase EvalFunc, que es la base para todas las funciones Eval. Todas las funciones de evaluación amplían la clase Java ‘org.apache.pig.EvalFunc. 'Está parametrizado con el tipo de retorno de la UDF, que es una cadena de Java en este caso. El método principal de esta clase es 'exec'. La primera línea del código indica que la función es parte del paquete myudfs.



python def __init __ (auto)

Toma un registro y devuelve un resultado, que se invocará para cada registro que pase por la canalización de ejecución. Toma una tupla, que contiene todos los campos que el script pasa a su UDF como entrada. Luego devuelve el tipo por el cual ha parametrizado EvalFunc.

Esta función se invoca en cada tupla de entrada. La entrada a la función es una tupla con parámetros de entrada en el orden en que se pasan a la función en el script Pig. En el ejemplo que se muestra a continuación, la función toma una cadena como entrada. La siguiente función convierte la cadena de minúsculas a mayúsculas. Ahora que la función está implementada, debe compilarse e incluirse en un JAR.

paquete myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER extiende EvalFunc {public String exec (entrada de Tuple) lanza IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {throw new IOException ('Excepción capturada procesando fila de entrada', e)}}}

Funciones agregadas:

Las funciones agregadas son otro tipo común de función Eval. Las funciones agregadas generalmente se aplican a datos agrupados. La función Aggregate toma una bolsa y devuelve un valor escalar. Una característica interesante y valiosa de muchas funciones agregadas es que se pueden calcular de forma incremental de manera distribuida. En el mundo de Hadoop, esto significa que los cálculos parciales pueden ser realizados por el Mapa y el Combinador y el resultado final puede ser calculado por el Reductor.

Es muy importante asegurarse de que las funciones agregadas que son algebraicas se implementen como tales. Los ejemplos de este tipo incluyen COUNT, MIN, MAX y AVERAGE integrados.

CONTAR es un ejemplo de una función algebraica en la que podemos contar el número de elementos en un subconjunto de los datos y luego sumar los conteos para producir un resultado final. Veamos la implementación de la función COUNT:

public class COUNT extiende EvalFunc implementa Algebraic {public Long exec (entrada de tupla) lanza IOException {return count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} public String getFinal () {return Final.class.getName ()} static public class Initial extiende EvalFunc {public Tuple exec (entrada de Tuple) lanza IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} clase pública estática Intermed extiende EvalFunc {ejecución de Tupla pública (entrada de tupla) lanza IOException {return TupleFactory.getInstance (). newTuple (suma (entrada))}} clase pública estática Final extiende EvalFunc {ejecución ejecutiva de tupla pública (entrada de tupla) IOException {return sum (input)}} static protected Long count (Tuple input) throws ExecException {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () else if (values instanceof Map) devuelve nuevos valores Long (((Map)) .size ())} Suma larga protegida estática (Tupla i nput) lanza ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) long sum = 0 for (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Long) t.get (0)} return sum}}

COUNT implementa una interfaz algebraica que se ve así:

public interface Algebraic {public String getInitial () public String getIntermed () public String getFinal ()}

Para que una función sea algebraica, necesita implementar una interfaz algebraica que consiste en la definición de tres clases derivadas de EvalFunc. El contrato es que la función de ejecución de la clase inicial se llama una vez y se pasa a la tupla de entrada original. Su salida es una tupla que contiene resultados parciales. La función ejecutiva de la clase Intermed se puede llamar cero o más veces y toma como entrada una tupla que contiene resultados parciales producidos por la clase Initial o por invocaciones previas de la clase Intermed y produce una tupla con otro resultado parcial. Finalmente, se llama a la función exec de la clase Final y da el resultado final como un tipo escalar.

cómo usar system.exit en java

Funciones de filtro:

Las funciones de filtro son funciones de evaluación que devuelven un valor booleano. Se puede usar en cualquier lugar donde sea apropiada una expresión booleana, incluido el operador FILTER o la expresión Bincond. Apache Pig no es totalmente compatible con booleanos, por lo que las funciones de filtro no pueden aparecer en declaraciones como 'Foreach', donde los resultados se envían a otro operador. Sin embargo, las funciones de filtro se pueden utilizar en declaraciones de filtro.

El siguiente ejemplo implementa la función IsEmpty:

import java.io.IOException import java.util.Map import org.apache.pig.FilterFunc import org.apache.pig.PigException import org.apache.pig.backend.executionengine.ExecException import org.apache.pig.data.DataBag import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * Determinar si una bolsa o mapa está vacío. * / public class IsEmpty extiende FilterFunc {@Override public Boolean exec (entrada de tupla) lanza IOException {try {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () == 0 else if (valores instancia de Map) return ((Map) valores) .size () == 0 else {int errCode = 2102 String msg = 'No se puede probar un' + DataType.findTypeName (valores) + 'por vacío.' lanzar nueva ExecException (msg, errCode, PigException.BUG)}} atrapar (ExecException ee) {lanzar ee}}}