Apache Pig UDF: Del 1 - Funksjoner for evaluering, aggregering og filter



Dette innlegget beskriver Apache Pig UDF - Eval, Aggregate & Filter Functions. Ta en titt på funksjonene Eval, Aggregate & Filter.

Apache Pig gir omfattende støtte for brukerdefinerte funksjoner (UDFer) som en måte å spesifisere tilpasset behandling på. Gris UDF kan for øyeblikket kjøres på tre språk: Java, Python, JavaScript og Ruby. Den mest omfattende støtten er gitt for Java-funksjoner.





Java UDF-er kan påberopes på flere måter. Den enkleste UDF kan bare utvide EvalFunc, som bare krever at exec-funksjonen skal implementeres. Hver Eval UDF må implementere dette. I tillegg, hvis en funksjon er algebraisk, kan den implementere algebraisk grensesnitt for å forbedre søkeytelsen betydelig.

Betydningen av UDF i gris:

Gris lar brukerne kombinere eksisterende operatører med sin egen eller andres kode via UDF-er. Fordelen med Pig er dens evne til å la brukere kombinere operatørene med sin egen eller andres kode via UDF. Opp gjennom versjon 0.7, må alle UDF-er skrives i Java og implementeres som Java-klasser. Dette gjør det lettere å legge til nye UDF-er til Pig ved å skrive en Java-klasse og informere Pig om JAR-filen.



Grisen i seg selv kommer med noen UDF-er. Før versjon 0.8 var det et veldig begrenset sett med bare standard SQL-aggregasjonsfunksjonene og noen få andre. I 0,8 ble et stort antall standard strengbehandlings-, matematikk- og komplekse UDF-er lagt til.

Hva er en Piggybank?

Piggybank er en samling av brukerbidragte UDF-er som blir gitt ut sammen med Pig. Piggybank UDF er ikke inkludert i Pig JAR, så du må registrere dem manuelt i skriptet. Du kan også skrive dine egne UDF-er eller bruke de som er skrevet av andre brukere.

Eval Funksjoner

UDF-klassen utvider EvalFunc-klassen som er basen for alle Eval-funksjoner. Alle evalueringsfunksjonene utvider Java-klassen ‘org.apache.pig.EvalFunc. ‘Det er parameterisert med returtypen til UDF som er en Java-streng i dette tilfellet. Kjernemetoden i denne klassen er 'exec.' Den første linjen i koden indikerer at funksjonen er en del av myudfs-pakken.



ekstern metode påkalling java eksempel

Det tar en post og returnerer ett resultat, som vil bli påkalt for hver post som går gjennom kjøringsrørledningen. Det tar en tuple som inneholder alle feltene skriptet overfører til UDF som en inngang. Den returnerer deretter typen du har parametrisert EvalFunc med.

Denne funksjonen påkalles på hver inngangs tuple. Inngangen i funksjonen er en tuple med inngangsparametere i den rekkefølgen de sendes til funksjonen i griseskriptet. I eksemplet vist nedenfor tar funksjonen streng som inndata. Følgende funksjon konverterer strengen fra små til store bokstaver. Nå som funksjonen er implementert, må den kompileres og inkluderes i en JAR.

pakke myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple offentlig klasse UPPER utvider 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 (Unntak e) {kast ny IOException ('Fanget unntak behandlingsinngangsrad', e)}}}

Aggregerte funksjoner:

Aggregerte funksjoner er en annen vanlig type Eval-funksjon. Aggregerte funksjoner brukes vanligvis på grupperte data. Aggregate-funksjonen tar en pose og returnerer en skalarverdi. Et interessant og verdifullt trekk ved mange samlede funksjoner er at de kan beregnes trinnvis på en distribuert måte. I Hadoop-verdenen betyr dette at de delvise beregningene kan gjøres av Map og Combiner, og det endelige resultatet kan beregnes av Reducer.

Det er veldig viktig å sørge for at aggregerte funksjoner som er algebraiske blir implementert som sådan. Eksempler på denne typen inkluderer innebygde COUNT, MIN, MAX og GJENNOMSNITT.

TELLE er et eksempel på en algebraisk funksjon der vi kan telle antall elementer i en delmengde av dataene og deretter summere tellingen for å produsere en endelig utgang. La oss se på implementeringen av COUNT-funksjonen:

offentlig klasse COUNT utvider 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 ()} public String getFinal () {return Final.class.getName ()} statisk offentlig klasse Initial utvider EvalFunc {public Tuple exec (Tuple input) kaster IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} statisk offentlig klasse Intermed utvider EvalFunc {public Tuple exec (Tuple input) kaster IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} static public class Final utvider EvalFunc {public Tuple exec (Tuple input) kaster IOException {retur sum (input)}} statisk beskyttet Langtall (Tuple input) kaster ExecException {Objektverdier = input.get (0) hvis (verdier for eksempel av DataBag) returnerer ((DataBag) verdier) .størrelse () annet hvis (verdier forekomst av Kart) returnerer nye Lange (((Kart) -verdier) .størrelse ())} statisk beskyttet Lang sum (Tuple i nput) kaster ExecException, NumberFormatException {DataBag-verdier = (DataBag) input.get (0) lang sum = 0 for (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Long) t.get (0)} return sum}}

COUNT implementerer algebraisk grensesnitt som ser slik ut:

offentlig grensesnitt Algebraisk {public String getInitial () public String getIntermed () public String getFinal ()}

For at en funksjon skal være algebraisk, må den implementere algebraisk grensesnitt som består av definisjon av tre klasser avledet fra EvalFunc. Kontrakten er at execfunction av den første klassen kalles en gang og blir sendt til den opprinnelige inngangs tuple. Resultatet er en tuple som inneholder delvise resultater. Exec-funksjonen til Intermed-klassen kan kalles null eller flere ganger og tar som inngang en tuple som inneholder delvise resultater produsert av den første klassen eller ved tidligere påkallelser av Intermed-klassen og produserer en tuple med et annet delvis resultat. Til slutt kalles exec-funksjonen til Final-klassen og gir det endelige resultatet som en skalartype.

Fibonacci c ++ rekursjon

Filterfunksjoner:

Filterfunksjoner er Eval-funksjoner som returnerer en boolsk verdi. Det kan brukes hvor som helst et boolsk uttrykk er passende, inkludert FILTER-operatoren eller Bincond-uttrykket. Apache Pig støtter ikke Boolean helt, så filterfunksjoner kan ikke vises i utsagn som 'Foreach', der resultatene sendes til en annen operatør. Filterfunksjoner kan imidlertid brukes i filteruttalelser.

Eksemplet nedenfor implementerer IsEmpty-funksjonen:

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 pose eller et kart er tomt. * / public class IsEmpty utvider FilterFunc {@Override public Boolean exec (Tuple input) kaster IOException {prøv {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .størrelse () == 0 annet hvis (verdier instans av kart) returnerer ((kart) verdier) .størrelse () == 0 annet {int errCode = 2102 Streng msg = 'Kan ikke teste et' + DataType.findTypeName (verdier) + 'for tomhet.' kaste ny ExecException (msg, errCode, PigException.BUG)}} fangst (ExecException ee) {throw ee}}}