Apache Pig UDF: 1. osa - funktsioonide hindamine, koondamine ja filtreerimine



Selles postituses kirjeldatakse Apache Pig UDF-i funktsioone Hindamine, koondamine ja filtreerimine. Heitke pilk funktsioonidele Eval, Aggregate & Filter.

Apache Pig pakub kohandatud töötlemise täpsustamiseks ulatuslikku tuge kasutaja määratud funktsioonidele (UDF-id). Sea UDF-e saab praegu käivitada kolmes keeles: Java, Python, JavaScript ja Ruby. Kõige ulatuslikum on Java-funktsioonide tugi.





Java UDF-e saab käivitada mitmel viisil. Lihtsaim UDF saab lihtsalt laiendada EvalFunci, mis nõuab ainult exec-funktsiooni rakendamist. Iga Eval UDF peab selle rakendama. Kui funktsioon on algebraline, võib see päringu jõudluse märkimisväärseks parandamiseks rakendada ka algebralise liidese.

erinevus agile ja devops vahel

UDF-ide tähtsus sead:

Pig võimaldab kasutajatel UDF-de kaudu kombineerida olemasolevaid operaatoreid enda või teiste koodiga. Pigi eeliseks on võime lubada kasutajatel UDF-de kaudu oma operaatoreid oma või teiste koodiga kombineerida. Kuni versioonini 0.7 peavad kõik UDF-id olema kirjutatud Java-keeles ja rakendatud Java-klassidena. See hõlbustab Pigile uute UDF-ide lisamist, kirjutades Java-klassi ja teavitades Pigi JAR-failist.



Sead ise on varustatud mõne UDF-iga. Enne versiooni 0.8 oli see väga piiratud komplekt, millel olid ainult standardsed SQL-i koondfunktsioonid ja mõned muud. Aastal 0.8 lisati suur hulk tavalisi stringide töötlemise, matemaatika ja komplekstüüpi UDF-e.

Mis on Piggybank?

Piggybank on kasutajate panustatud UDF-ide kogu, mis antakse välja koos Pigiga. Piggybanki UDF-id ei kuulu Pig JARi, seega peate need käsitsi oma skripti registreerima. Võite ka ise oma UDF-e kirjutada või kasutada teiste kasutajate kirjutatud faile.

Hinda funktsioone

UDF-klass laiendab klassi EvalFunc, mis on kõigi Eval-funktsioonide alus. Kõik hindamisfunktsioonid laiendavad Java-klassi ‘org.apache.pig.EvalFunc. 'See on parameetritud UDF-i tagastustüübiga, mis on sel juhul Java string. Selle klassi põhimeetod on ‘exec.’ Koodi 1. rida näitab, et funktsioon on osa myudfs paketist.



See võtab ühe kirje ja tagastab ühe tulemuse, mida kutsutakse iga plaadi kohta, mis läbib täitmistorustikku. Selleks on vaja dupletti, mis sisaldab kõiki väljad, mille skript teie UDF-le sisendina edastab. Seejärel tagastab tüüp, mille järgi olete EvalFunci parameetrid määranud.

Seda funktsiooni rakendatakse igal sisendkorrusel. Funktsiooni sisend on dupleks, millel on sisendparameetrid selles järjekorras, nagu need edastatakse funktsioonile Pig-skriptis. Allpool toodud näites võtab funktsioon sisendiks stringi. Järgmine funktsioon teisendab stringi väiketähest suureks. Nüüd, kui funktsioon on rakendatud, tuleb see kompileerida ja lisada JAR-i.

kuidas kasutada java keeles trimmi
pakett myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER laiendab EvalFunc {public String exec (Tuple sisend) viskab IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {dob uus IOException ('Püütud erandi töötlemise sisendrida', e)}}}

Koondfunktsioonid:

Agregaatfunktsioonid on veel üks levinud Eval-funktsiooni tüüp. Koondfunktsioonid rakendatakse tavaliselt rühmitatud andmetele. Funktsioon Aggregate võtab koti ja tagastab skalaarväärtuse. Paljude koondfunktsioonide huvitav ja väärtuslik omadus on see, et neid saab järk-järgult arvutada hajutatult. Hadoopi maailmas tähendab see seda, et osalised arvutused saab teha Map ja Combiner ja lõpptulemuse saab reduktor.

On väga oluline veenduda, et algebralised koondfunktsioonid oleksid sellisena rakendatud. Seda tüüpi näited hõlmavad sisseehitatud COUNT, MIN, MAX ja AVERAGE.

COUNT on näide algebralisest funktsioonist, kus saame loendada andmete alamhulga elementide arvu ja seejärel kokku arvutada, et saada lõplik väljund. Vaatame funktsiooni COUNT rakendamist:

mida teeb Linuxi administraator
avalik klass COUNT laiendab EvalFunc rakendab algebralikku {public Long exec (Tuple'i sisend) viskab 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 ()} staatiline avalik klass Esialgne laiendab EvalFunc {public Tuple exec (Tuple sisestus) viskab IOException {return TupleFactory.getInstance (). newTuple (count (sisend)) }} staatiline avalik klass Intermed laiendab EvalFunc {public Tuple exec (Tuple sisend) viskab IOExceptioni {return TupleFactory.getInstance (). newTuple (summa (sisend))}} staatiline avalik klass Final extends EvalFunc {public Tuple exec (Tuple sisend) viskab IOException {return summa (input)}} staatiliselt kaitstud Pikk loendus (Tuple sisend) viskab ExecException {Object values ​​= input.get (0) if (väärtused DataBag) tagastavad ((DataBag) väärtused) .size () else if (väärtused kaardi instants) tagastab uued pikkad ((((kaart)) väärtused). suurus ())} staatiliselt kaitstud pikk summa (Tuple i nput) viskab ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) pikk summa = 0 for (Iterator (Tuple) it = väärtused.iterator () it.hasNext ()) {Tuple t = it.next ( ) summa + = (pikk) t.get (0)} tagastussumma}}

COUNT rakendab algebralist liidest, mis näeb välja selline:

avalik liides Algebraline {public String getInitial () public String getIntermed () public String getFinal ()}

Et funktsioon oleks algebraline, peab see rakendama algebralise liidese, mis koosneb EvalFuncist tuletatud kolme klassi määratlusest. Leping on see, et klassi Initial käivitamisfunktsioon kutsutakse üks kord ja see edastatakse algsele sisendtupule. Selle väljund on paar, mis sisaldab osalisi tulemusi. Intermed-klassi exec-funktsiooni võib nimetada nulliks või rohkemaks ning selle sisendiks on duplett, mis sisaldab klassi Initial või Intermed-klassi eelnevate kutsete abil saadud osalisi tulemusi ja annab teise osalise tulemusega dupleksi. Lõpuks kutsutakse klassi Final funktsioon exec, mis annab lõpptulemuse skalaartüübina.

Filtri funktsioonid:

Filtrifunktsioonid on Eval-funktsioonid, mis tagastavad Boole'i ​​väärtuse. Seda saab kasutada kõikjal, kus Boole'i ​​väljend sobib, sealhulgas operaator FILTER või Bincondi avaldis. Apache Pig ei toeta Boole'i ​​täielikult, mistõttu filtrifunktsioone ei saa ilmuda lausetes nagu ‘Foreach’, kus tulemused väljastatakse teisele operaatorile. Filtrifunktsioone saab aga kasutada filtrilausetes.

Allpool toodud näide rakendab funktsiooni 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 / ** * Tehke kindlaks, kas kott või kaart on tühjad. * / avalik klass IsEmpty laiendab FilterFunc {@Orride public Boolean exec (Tuple input) viskab IOException {proovige {Object values ​​= input.get (0) if (väärtused DataBag) tagastavad ((DataBag) väärtused) .size () == 0 muud, kui (kaardi instantsiväärtused) tagastavad ((kaart) väärtused) .suze () == 0 else {int errCode = 2102 String msg = 'Ei saa tühjuse testimiseks' + DataType.findTypeName (väärtused) + '.' viska uus ExecException (msg, errCode, PigException.BUG)}} saak (ExecException ee) {viska ee}}}