Apache Pig UDF: 1. del - Eval, agregatne in filtrirne funkcije



Ta objava opisuje funkcijo Apache Pig UDF - funkcije Eval, agregat in filter. Oglejte si funkcije Eval, agregat in filter.

Apache Pig ponuja obsežno podporo za uporabniško določene funkcije (UDF) kot način določanja obdelave po meri. Prašičje UDF je trenutno mogoče izvajati v treh jezikih: Java, Python, JavaScript in Ruby. Najobsežnejša podpora je na voljo za funkcije Java.





UDF-je Java je mogoče priklicati na več načinov. Najenostavnejši UDF lahko samo razširi EvalFunc, ki zahteva samo izvedbo funkcije exec. Vsak Eval UDF mora to izvesti. Če je funkcija algebraična, lahko implementira algebraični vmesnik, da znatno izboljša zmogljivost poizvedbe.

Pomen UDF pri prašičih:

Pig uporabnikom omogoča, da obstoječe operaterje kombinirajo s svojo ali tujo kodo prek UDF-jev. Prednost Pig-a je v tem, da uporabnikom omogoča, da prek UDF kombinirajo njegove operaterje s svojo kodo ali kodo drugih. Do različice 0.7 morajo biti vsi UDF-ji napisani v Javi in ​​se izvajajo kot razredi Java. To olajša dodajanje novih UDF-jev v Pig s pisanjem razreda Java in obveščanjem Pig-a o datoteki JAR.



Prašič ima nekaj UDF-jev. Pred različico 0.8 je bil zelo omejen nabor s samo standardnimi skupnimi funkcijami SQL in nekaj drugimi. V 0.8 je bilo dodano veliko število standardnih UDF za obdelavo nizov, matematiko in kompleksni tip.

kaj naredi razvijalec tabel

Kaj je Piggybank?

Piggybank je zbirka uporabniških UDF, ki je izdana skupaj s Pig. UDF-ji Piggybank niso vključeni v PAR JAR, zato jih morate ročno registrirati v skriptu. Lahko tudi napišete lastne UDF-je ali uporabite tiste, ki so jih napisali drugi uporabniki.

Funkcije Eval

Razred UDF razširja razred EvalFunc, ki je osnova za vse funkcije Eval. Vse funkcije ocenjevanja razširjajo razred Java 'org.apache.pig.EvalFunc. ‘Parametrizira se z vrnjeno vrsto UDF, ki je v tem primeru Java String. Osrednja metoda v tem razredu je 'exec.' 1. vrstica kode označuje, da je funkcija del paketa myudfs.



je sas programski jezik

Potrebuje en zapis in vrne en rezultat, ki se prikliče za vsak zapis, ki gre skozi izvedbeni cevovod. Potreben je nabor, ki vsebuje vsa polja, ki jih skript posreduje vašemu UDF kot vhod. Nato vrne tip, s katerim ste parametrirali EvalFunc.

Ta funkcija se prikliče v vseh vhodnih sklopih. Vhod v funkcijo je nabor z vhodnimi parametri v vrstnem redu, kot so posredovani funkciji v skriptu Pig. V spodnjem primeru funkcija za vhod vzame niz. Naslednja funkcija pretvori niz iz malega v velikega. Zdaj, ko je funkcija izvedena, jo je treba zbrati in vključiti v JAR.

paket myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple javni razred UPPER razširja EvalFunc {javni niz exec (Tuple input) vrže IOException {if (input == null || input.size () == 0) vrni ničelno poskusi {String str = (String) input.get (0) return str.toUpperCase ()} catch (Izjema e) {throw new IOException ('Ujeta izjema obdelava vhodne vrstice', e)}}}

Združene funkcije:

Združene funkcije so še ena pogosta vrsta funkcije Eval. Združene funkcije se običajno uporabljajo za združene podatke. Funkcija združevanja prevzame vrečo in vrne skalarno vrednost. Zanimiva in dragocena lastnost številnih skupnih funkcij je, da jih je mogoče postopoma izračunati na porazdeljen način. V svetu Hadoop to pomeni, da lahko delne izračune izvajata Map in Combiner, končni rezultat pa Reducer.

Zelo pomembno je zagotoviti, da se agregatne funkcije, ki so algebraične, izvajajo kot take. Primeri te vrste vključujejo vgrajene COUNT, MIN, MAX in AVERAGE.

pl sql vadnica s primeri

ŠT je primer algebrske funkcije, kjer lahko preštejemo število elementov v podnaboru podatkov in nato seštejemo štetje, da dobimo končni izhod. Oglejmo si izvajanje funkcije COUNT:

javni razred COUNT se razširi EvalFunc implementira algebrski {javni Long exec (Tuple input) vrže IOException {return count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} javni niz getFinal () {return Final.class.getName ()} statični javni razred Initial extends EvalFunc {public Tuple exec (Tuple input) vrže IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} statični javni razred Intermed podaljša EvalFunc {javni Tuple exec (Tuple input) vrže IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} static public class Final extends EvalFunc {public Tuple exec (Tuple input) meče IOException {vrnitev vsote (vhod)}} statično zaščiteno Long count (Tuple input) vrže ExecException {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () else if (vrednosti instanceof Map) vrne nove Long (((Map) vrednosti) .size ())} statično zaščitena Long sum (Tuple i nput) vrže ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) long sum = 0 for (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) vsota + = (dolga) t.get (0)} vrnjena vsota}}

COUNT izvaja algebrski vmesnik, ki je videti takole:

javni vmesnik Algebraic {javni niz getInitial () javni niz getIntermed () javni niz getFinal ()}

Da je funkcija algebraična, mora implementirati algebraični vmesnik, ki je sestavljen iz definicije treh razredov, pridobljenih iz EvalFunc. Pogodba določa, da se izvršilna funkcija začetnega razreda enkrat pokliče in prenese v prvotni vhodni sklop. Njegov izhod je sklop, ki vsebuje delne rezultate. Funkcijo exec razreda Intermed lahko pokličete nič ali večkrat in za svoj vhod vzame paket, ki vsebuje delne rezultate, ki jih ustvari začetni razred ali predhodni klici razreda Intermed, in ustvari komplet z drugim delnim rezultatom. Na koncu se pokliče funkcija exec končnega razreda, ki daje končni rezultat kot skalarni tip.

Funkcije filtra:

Funkcije filtra so funkcije Eval, ki vrnejo logično vrednost. Uporablja se lahko kjer koli je primeren logični izraz, vključno z operatorjem FILTER ali izrazom Bincond. Apache Pig ne podpira logične logike, zato funkcije filtriranja ne morejo biti prikazane v stavkih, kot je „Foreach“, kjer se rezultati prikažejo drugemu operaterju. Vendar pa je mogoče funkcije filtrov uporabiti v izjavah o filtriranju.

Spodnji primer izvaja funkcijo 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.DataBata import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * Ugotovite, ali je vreča ali zemljevid prazen. * / javni razred IsEmpty razširja FilterFunc {@Override javni logični exec (Tuple input) vrže IOException {try {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () == 0 else if (vrednosti instanceof Map) vrnejo ((Map) vrednosti) .size () == 0 else {int errCode = 2102 String msg = 'Ni mogoče preizkusiti' + DataType.findTypeName (vrednosti) + 'za praznino.' vrzi nov ExecException (msg, errCode, PigException.BUG)}} catch (ExecException ee) {throw ee}}}