Apache Pig UDF: Del 1 - Evaluer, samlede & filterfunktioner



Dette indlæg beskriver om Apache Pig UDF - Eval, Aggregate & Filter Funktioner. Se på funktionerne Eval, Aggregate & Filter.

Apache Pig giver omfattende support til brugerdefinerede funktioner (UDF'er) som en måde at specificere tilpasset behandling på. Gris UDF'er kan i øjeblikket udføres på tre sprog: Java, Python, JavaScript og Ruby. Den mest omfattende support ydes til Java-funktioner.





Java UDF'er kan påberåbes på flere måder. Den enkleste UDF kan bare udvide EvalFunc, hvilket kun kræver exec-funktionen, der skal implementeres. Hver Eval UDF skal implementere dette. Derudover, hvis en funktion er algebraisk, kan den implementere algebraisk grænseflade for at forbedre forespørgselens ydeevne betydeligt.

print_r til streng

Betydningen af ​​UDF'er i svin:

Gris giver brugerne mulighed for at kombinere eksisterende operatører med deres egen eller andres kode via UDF'er. Fordelen ved Pig er dens evne til at lade brugerne kombinere sine operatører med deres egen eller andres kode via UDF'er. Op gennem version 0.7 skal alle UDF'er være skrevet i Java og implementeres som Java-klasser. Dette gør det lettere at tilføje nye UDF'er til Pig ved at skrive en Java-klasse og informere Pig om JAR-filen.



Grisen selv kommer med nogle UDF'er. Før version 0.8 var det et meget begrænset sæt med kun standard SQL-aggregatfunktioner og et par andre. I 0,8 blev et stort antal UDF'er til standardstrengebehandling, matematik og kompleks type tilføjet.

Hvad er en sparegris?

Piggybank er en samling af brugerbidragte UDF'er, der frigives sammen med Pig. Piggybank UDF'er er ikke inkluderet i Pig JAR, så du skal registrere dem manuelt i dit script. Du kan også skrive dine egne UDF'er eller bruge dem skrevet af andre brugere.

Eval-funktioner

UDF-klassen udvider EvalFunc-klassen, som er basen for alle Eval-funktioner. Alle evalueringsfunktioner udvider Java-klassen 'org.apache.pig.EvalFunc. ‘Det parametriseres med returtypen for UDF, som i dette tilfælde er en Java-streng. Kernemetoden i denne klasse er 'exec.' Den første linje i koden indikerer, at funktionen er en del af myudfs-pakken.



Det tager en post og returnerer et resultat, som påberåbes for hver post, der passerer gennem udførelsesrørledningen. Det tager en tuple, som indeholder alle de felter, som scriptet overfører til din UDF som input. Derefter returnerer den type, som du har parametreret EvalFunc med.

Denne funktion påberåbes på hver indgangstuple. Indtastningen i funktionen er en tuple med inputparametre i den rækkefølge, de overføres til funktionen i Pig-scriptet. I eksemplet vist nedenfor tager funktionen streng som input. Den følgende funktion konverterer strengen fra små til store bogstaver. Nu hvor funktionen er implementeret, skal den kompileres og inkluderes i en JAR.

android studie tutorials til begyndere
pakke myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple offentlig klasse UPPER udvider EvalFunc {public String exec (Tuple input) kaster IOException {if (input == null || input.size () == 0) return null prøv {String str = (String) input.get (0) return str.toUpperCase ()} catch (Undtagelse e) {smid ny IOException ('Fanget undtagelsesbehandling input række', e)}}}

Samlede funktioner:

Samlede funktioner er en anden almindelig type Eval-funktion. Samlede funktioner anvendes normalt på grupperede data. Den samlede funktion tager en taske og returnerer en skalarværdi. Et interessant og værdifuldt træk ved mange samlede funktioner er, at de kan beregnes trinvist på en distribueret måde. I Hadoop-verdenen betyder dette, at de delvise beregninger kan udføres af Map og Combiner, og det endelige resultat kan beregnes af Reducer.

Det er meget vigtigt at sikre, at samlede funktioner, der er algebraiske, implementeres som sådan. Eksempler på denne type inkluderer den indbyggede COUNT, MIN, MAX og AVERAGE.

TÆLLE er et eksempel på en algebraisk funktion, hvor vi kan tælle antallet af elementer i en delmængde af dataene og derefter summere tællingerne for at producere et endeligt output. Lad os se på implementeringen af ​​COUNT-funktionen:

konvertere en streng til dato i java
offentlig klasse COUNT udvider EvalFunc implementerer algebraisk {public Long exec (Tuple input) kaster IOException {return count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} offentlig String getFinal () {return Final.class.getName ()} statisk offentlig klasse Initial udvider EvalFunc {public Tuple exec (Tuple input) kaster IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} statisk offentlig klasse Intermed udvider EvalFunc {public Tuple exec (Tuple input) kaster IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} statisk public class Final forlænger EvalFunc {public Tuple exec (Tuple input) kaster IOException {retur sum (input)}} statisk beskyttet Langtælling (Tuple input) kaster ExecException {Objektværdier = input.get (0) hvis (værdier for eksempel af DataBag) returnerer ((DataBag) værdier) .størrelse () ellers hvis (værdier forekomst af kort) returnerer nye lange (((kort) værdier) .størrelse ())} statisk beskyttet lang sum (Tuple i nput) kaster ExecException, NumberFormatException {DataBag-værdier = (DataBag) input.get (0) lang sum = 0 for (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Lang) t.get (0)} retur sum}}

COUNT implementerer algebraisk grænseflade, der ser sådan ud:

offentlig grænseflade Algebraisk {offentlig String getInitial () offentlig String getIntermed () offentlig String getFinal ()}

For at en funktion skal være algebraisk, skal den implementere algebraisk grænseflade, der består af definition af tre klasser afledt af EvalFunc. Kontrakten er, at execfunction af den oprindelige klasse kaldes en gang og sendes til den oprindelige input-tuple. Dens output er en tuple, der indeholder delvise resultater. Interec-klassens exec-funktion kan kaldes nul eller flere gange og tager som input en tuple, der indeholder delresultater produceret af den oprindelige klasse eller ved tidligere påkald af Intermed-klassen og producerer en tuple med et andet delresultat. Endelig kaldes exec-funktionen i Final-klassen og giver det endelige resultat som en skalartype.

Filterfunktioner:

Filterfunktioner er Eval-funktioner, der returnerer en boolsk værdi. Det kan bruges hvor som helst et boolsk udtryk er passende, inklusive FILTER-operatoren eller Bincond-udtrykket. Apache Pig understøtter ikke Boolean fuldstændigt, så Filterfunktioner kan ikke vises i udsagn som 'Foreach', hvor resultaterne sendes til en anden operatør. Filterfunktioner kan dog bruges i filterudtalelser.

Eksemplet nedenfor implementerer IsEmpty-funktionen:

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 / ** * Bestem, om en taske eller et kort er tomt. * / public class IsEmpty udvider FilterFunc {@Override public Boolean exec (Tuple input) kaster IOException {prøv {Objektværdier = input.get (0) hvis (værdier for eksempel af DataBag) returnerer ((DataBag) værdier) .størrelse () == 0 andet hvis (værdier instans af kort) returnerer ((kort) værdier) .størrelse () == 0 andet {int errCode = 2102 String msg = 'Kan ikke teste et' + DataType.findTypeName (værdier) + 'for tomhed.' smid ny ExecException (msg, errCode, PigException.BUG)}} fangst (ExecException ee) {throw ee}}}