Apache Pig UDF: Parte 1 - Funções de avaliação, agregação e filtro



Esta postagem descreve sobre o Apache Pig UDF - funções de avaliação, agregação e filtro. Dê uma olhada nas funções de avaliação, agregação e filtro.

O Apache Pig fornece amplo suporte para funções definidas pelo usuário (UDFs) como uma forma de especificar o processamento personalizado. Pig UDFs podem atualmente ser executados em três idiomas: Java, Python, JavaScript e Ruby. O suporte mais extenso é fornecido para funções Java.





UDFs Java podem ser chamados de várias maneiras. O UDF mais simples pode apenas estender EvalFunc, que requer apenas a função exec para ser implementada. Cada Eval UDF deve implementar isso. Além disso, se uma função for algébrica, ela pode implementar a interface algébrica para melhorar significativamente o desempenho da consulta.

Importância das UDFs em Porcos:

O Pig permite que os usuários combinem os operadores existentes com seus próprios códigos ou de outros por meio de UDFs. A vantagem do Pig é sua capacidade de permitir que os usuários combinem seus operadores com seus próprios códigos ou de outros por meio de UDFs. Até a versão 0.7, todos os UDFs devem ser escritos em Java e são implementados como classes Java. Isso torna mais fácil adicionar novos UDFs ao Pig, escrevendo uma classe Java e informando ao Pig sobre o arquivo JAR.



O próprio Pig vem com alguns UDFs. Antes da versão 0.8, era um conjunto muito limitado com apenas as funções de agregação SQL padrão e algumas outras. No 0.8, um grande número de UDFs de processamento de string padrão, matemática e de tipo complexo foram adicionados.

como criar um jframe

O que é um Piggybank?

Piggybank é uma coleção de UDFs contribuídas por usuários que é lançada junto com o Pig. UDFs do Piggybank não estão incluídos no Pig JAR, portanto, você deve registrá-los manualmente em seu script. Você também pode escrever seus próprios UDFs ou usar aqueles escritos por outros usuários.

Funções de avaliação

A classe UDF estende a classe EvalFunc, que é a base para todas as funções Eval. Todas as funções de avaliação estendem a classe Java ‘org.apache.pig.EvalFunc. ‘É parametrizado com o tipo de retorno do UDF, que é uma String Java neste caso. O método principal desta classe é ‘exec.’ A 1ª linha do código indica que a função faz parte do pacote myudfs.



Leva um registro e retorna um resultado, que será invocado para cada registro que passa pelo pipeline de execução. É necessária uma tupla, que contém todos os campos que o script passa para sua UDF como entrada. Em seguida, ele retorna o tipo pelo qual você parametrizou o EvalFunc.

Esta função é chamada em cada tupla de entrada. A entrada na função é uma tupla com parâmetros de entrada na ordem em que são passados ​​para a função no script Pig. No exemplo mostrado abaixo, a função usa string como entrada. A função a seguir converte a string de minúsculas para maiúsculas. Agora que a função está implementada, ela precisa ser compilada e incluída em um JAR.

pacote myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER estende EvalFunc {public String exec (entrada Tuple) lança 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 ('Captura de exceção processando linha de entrada', e)}}}

Funções agregadas:

Funções agregadas são outro tipo comum de função Eval. As funções de agregação geralmente são aplicadas a dados agrupados. A função Aggregate pega um saco e retorna um valor escalar. Um recurso interessante e valioso de muitas funções Aggregate é que elas podem ser calculadas incrementalmente de maneira distribuída. No mundo Hadoop, isso significa que os cálculos parciais podem ser feitos pelo Mapa e Combinador e o resultado final pode ser calculado pelo Redutor.

É muito importante certificar-se de que as funções de agregação que são algébricas sejam implementadas como tal. Exemplos desse tipo incluem COUNT, MIN, MAX e AVERAGE embutidos.

CONTAGEM é um exemplo de uma função algébrica em que podemos contar o número de elementos em um subconjunto dos dados e, em seguida, somar as contagens para produzir uma saída final. Vejamos a implementação da função COUNT:

public class COUNT extends EvalFunc implementa Algebraic {public Long exec (entrada Tuple) lança 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 estende EvalFunc {public Tuple exec (Tuple input) lança IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} static public class Intermed extends EvalFunc {public Tuple exec (Tuple input) throws IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} static public class Final extends EvalFunc {public Tuple exec (Tuple input) throws 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) return new Long (((Map) values) .size ())} static protected Long sum (Tuple i nput) lança ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) long sum = 0 para (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) soma + = (Longo) t.get (0)} soma de retorno}}

COUNT implementa interface algébrica que se parece com isto:

interface pública Algébrica {public String getInitial () public String getIntermed () public String getFinal ()}

Para que uma função seja algébrica, ela precisa implementar uma interface algébrica que consiste na definição de três classes derivadas de EvalFunc. O contrato é que a função de execução da classe inicial é chamada uma vez e passada para a tupla de entrada original. Sua saída é uma tupla que contém resultados parciais. A função exec da classe Intermed pode ser chamada zero ou mais vezes e recebe como entrada uma tupla que contém resultados parciais produzidos pela classe Initial ou por invocações anteriores da classe Intermed e produz uma tupla com outro resultado parcial. Finalmente, a função exec da classe Final é chamada e fornece o resultado final como um tipo escalar.

Funções de filtro:

Funções de filtro são funções de avaliação que retornam um valor booleano. Ele pode ser usado em qualquer lugar em que uma expressão booleana seja apropriada, incluindo o operador FILTER ou a expressão Bincond. O Apache Pig não oferece suporte totalmente ao Booleano, portanto, as funções de filtro não podem aparecer em instruções como ‘Foreach’, onde os resultados são enviados para outro operador. No entanto, as funções de filtro podem ser usadas em instruções de filtro.

o que são dados combinados no tableau

O exemplo abaixo implementa a função 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 / ** * Determine se uma bolsa ou mapa está vazio. * / public class IsEmpty extends FilterFunc {@Override public Boolean exec (Tuple input) throws IOException {try {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () == 0 else if (values ​​instanceof Map) return ((Map) values) .size () == 0 else {int errCode = 2102 String msg = 'Não é possível testar um' + DataType.findTypeName (valores) + 'para vazio.' lance novo ExecException (msg, errCode, PigException.BUG)}} catch (ExecException ee) {throw ee}}}