„Apache Pig UDF“: 1 dalis. Įvertinimo, agregavimo ir filtravimo funkcijos



Šiame įraše aprašoma apie „Apache Pig UDF“ - vertinimo, agregavimo ir filtravimo funkcijas. Pažvelkite į „Eval, Aggregate & Filter“ funkcijas.

„Apache Pig“ teikia platų vartotojo nustatytų funkcijų (UDF) palaikymą kaip būdą nurodyti pasirinktinį apdorojimą. „Pig UDF“ failai šiuo metu gali būti vykdomi trimis kalbomis: „Java“, „Python“, „JavaScript“ ir „Ruby“. Plačiausias palaikymas teikiamas „Java“ funkcijoms.





„Java“ UDF galima iškviesti keliais būdais. Paprasčiausias UDF gali tiesiog išplėsti „EvalFunc“, kuriam įgyvendinti reikalinga tik „exec“ funkcija. Kiekvienas „Eval UDF“ turi tai įgyvendinti. Be to, jei funkcija yra algebrinė, ji gali įdiegti algebrinę sąsają, kad žymiai pagerintų užklausos našumą.

UDF svarba kiaulėms:

Pig leidžia vartotojams sujungti esamus operatorius su savo ar kitų kodu per UDF. „Pig“ pranašumas yra galimybė leisti vartotojams sujungti savo operatorius su savo ar kitų kodu per UDF. Iki 0.7 versijos visi UDF turi būti parašyti „Java“ ir yra įgyvendinami kaip „Java“ klasės. Tai palengvina naujų „UDF“ pridėjimą prie „Pig“, parašant „Java“ klasę ir informuojant „Pig“ apie JAR failą.



Kiaulė pati turi keletą UDF. Iki 0.8 versijos tai buvo labai ribotas rinkinys, kuriame buvo tik standartinės SQL suvestinės funkcijos ir keletas kitų. Į 0.8 buvo pridėta daugybė standartinių eilučių apdorojimo, matematikos ir kompleksinio tipo UDF.

išanalizuoti eilutę iki datos java

Kas yra Piggybank?

„Piggybank“ yra vartotojų įneštų UDF rinkinys, išleidžiamas kartu su „Pig“. Piggybank UDF nėra įtraukti į Pig JAR, todėl jūs turite juos registruoti rankiniu būdu savo scenarijuje. Taip pat galite rašyti savo UDF arba naudoti tuos, kuriuos parašė kiti vartotojai.

Įvertinti funkcijas

UDF klasė išplečia „EvalFunc“ klasę, kuri yra visų „Eval“ funkcijų pagrindas. Visos vertinimo funkcijos praplečia „Java“ klasę „org.apache.pig.EvalFunc“. ‘Jis parametruojamas su grąžinimo tipu UDF, kuris šiuo atveju yra„ Java “eilutė. Pagrindinis šios klasės metodas yra „exec“. Pirmoji kodo eilutė rodo, kad funkcija yra „myudfs“ paketo dalis.



Tai užima vieną įrašą ir pateikia vieną rezultatą, kuris bus iškviestas už kiekvieną įrašą, einantį per vykdymo vamzdyną. Tai užima porą, kurioje yra visi laukai, kuriuos scenarijus perduoda jūsų UDF kaip įvestį. Tada jis pateikia tipą, pagal kurį parametravote „EvalFunc“.

Ši funkcija naudojama kiekviename įvesties pakete. Įvestis į funkciją yra paketas su įvesties parametrais tokia tvarka, kokia jie perduodami funkcijai „Pig“ scenarijuje. Žemiau pateiktame pavyzdyje funkcija ima eilutę kaip įvestį. Ši funkcija paverčia eilutę iš mažųjų į didžiąsias. Dabar, kai funkcija įdiegta, ją reikia sudaryti ir įtraukti į JAR.

paketas myudfs importuoti java.io.IOException importuoti org.apache.pig.EvalFunc importuoti org.apache.pig.data.Tuple public class UPPER prailgina EvalFunc {public String exec (Tuple įvestis) meta IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {thrown new IOException ('Pagauta išimtis apdorojanti įvesties eilutę', e)}}}

Suvestinės funkcijos:

Sudėtinės funkcijos yra dar vienas įprastas „Eval“ funkcijos tipas. Grupuotiems duomenims paprastai taikomos suvestinės funkcijos. Funkcija „Apibendrinti“ paima maišą ir grąžina skaliarinę vertę. Įdomi ir vertinga daugelio agregato funkcijų savybė yra ta, kad jas galima laipsniškai apskaičiuoti paskirstytu būdu. „Hadoop“ pasaulyje tai reiškia, kad dalinius skaičiavimus gali atlikti „Map and Combiner“, o galutinį rezultatą - reduktorius.

Labai svarbu įsitikinti, kad algebrinės agregato funkcijos yra įgyvendinamos kaip tokios. Tokio tipo pavyzdžiai yra įmontuoti COUNT, MIN, MAX ir AVERAGE.

COUNT yra algebrinės funkcijos pavyzdys, kai mes galime suskaičiuoti elementų skaičių duomenų pogrupyje ir susumuoti skaičius, kad gautume galutinę išvestį. Pažvelkime į COUNT funkcijos įgyvendinimą:

public class COUNT pratęsia EvalFunc įgyvendina Algebraic {public Long exec (Tuple įvestis) meta 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 ()} statinė viešoji klasė Initial prailgina EvalFunc {public Tuple exec (Tuple įvestis) meta IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} statinė viešoji klasė „Intermed“ pratęsia „EvalFunc“ {public Tuple exec (Tuple input) throws IOException {return TupleFactory.getInstance (). newTuple (summa (input))}} statinė viešoji klasė Final extends EvalFunc {public Tuple exec (Tuple input) throws „IOException“ {return summa (input)}} - statinis apsaugotas Ilgas skaičius (Tuple įvestis) išmeta „ExecException“ {Object values ​​= input.get (0) if (reikšmės „DataBag“ vertės grąžina ([DataBag] reikšmes) .size () else if (reikšmės Žemėlapio egzempliorius) grąžinti naujas ilgas (((žemėlapio) reikšmes) .size ())} statine apsaugota ilga suma (Tuple i nput) meta ExecException, NumberFormatException {DataBag reikšmės = (DataBag) input.get (0) ilga suma = 0 (Iterator (Tuple) it = reikšmės.iterator () it.hasNext ()) {Tuple t = it.next ( ) suma + = (ilga) t.get (0)} grąžos suma}}

COUNT įgyvendina algebrinę sąsają, kuri atrodo taip:

viešoji sąsaja Algebraic {public String getInitial () public String getIntermed () public String getFinal ()}

Kad funkcija būtų algebrinė, jai reikia įdiegti algebrinę sąsają, kurią sudaro trijų klasių, gautų iš „EvalFunc“, apibrėžimas. Sutartis yra ta, kad pradinės klasės vykdymas iškviečiamas vieną kartą ir perduodamas į pradinį įvesties paketą. Jo išvestis yra dvigubas rezultatas, kuriame yra daliniai rezultatai. „Intermed“ klasės „Exec“ funkcija gali būti vadinama nuliu ar daugiau kartų, o jos įvestimi imamas duobutė, kurioje yra daliniai rezultatai, kuriuos sukūrė „Initial“ klasė arba ankstesni „Intermed“ klasės kvietimai, ir gaunamas dvigubas rezultatas su kitu daliniu rezultatu. Galiausiai iškviečiama „Final“ klasės „exec“ funkcija ir suteikia galutinį rezultatą kaip skaliarinį tipą.

Filtro funkcijos:

Filtro funkcijos yra „Eval“ funkcijos, kurios grąžina Bulio reikšmę. Ją galima naudoti bet kur, kur tinka loginė išraiška, įskaitant operatorių FILTER arba Bincond. „Apache Pig“ visiškai nepalaiko loginės logikos, todėl filtro funkcijos negali būti rodomos tokiuose sakiniuose kaip „Foreach“, kur rezultatai pateikiami kitam operatoriui. Tačiau filtro funkcijose galima naudoti filtro sakinius.

ką daro lentos kūrėjas

Toliau pateiktame pavyzdyje įgyvendinama „IsEmpty“ funkcija:

importuoti java.io.IOException importuoti java.util.Map importuoti org.apache.pig.FilterFunc importuoti org.apache.pig.PigException importuoti org.apache.pig.backend.executionengine.ExecException importuoti org.apache.pig.data.DataBag importuoti org.apache.pig.data.Tuple importuoti org.apache.pig.data.DataType / ** * Nustatykite, ar krepšys ar žemėlapis tušti. * / public class „IsEmpty“ praplečia „FilterFunc“ {@Paisyti viešąjį Boolean vykdymą („Tuple“ įvestis) išmeta „IOException“ {pabandykite {Object values ​​= input.get (0) if (reikšmės „DataBag“ vertės grąžina ((DataBag) reikšmes). dydis () == 0 dar, jei (Žemėlapio egzemplioriaus reikšmės) grąžina ((Žemėlapis) reikšmes). Dydis () == 0 kitas {int errCode = 2102 String msg = 'Negalima patikrinti, ar tuštumas' + DataType.findTypeName (reikšmės) + '.' mesti naują „ExecException“ (msg, errCode, PigException.BUG)}} gaudyti („ExecException ee“) {mesti ee}}}