Apache Pig UDF: Osa 1 - Arviointi, yhdistäminen ja suodattaminen



Tämä viesti kuvaa Apache Pig UDF: n arviointi-, koo- ja suodatusfunktioista. Tutustu Eval-, Aggregate & Filter -toimintoihin.

mikä on sqlite-selain

Apache Pig tarjoaa laajan tuen käyttäjän määrittelemille toiminnoille (UDF) tapana määrittää mukautettu käsittely. Sika-UDF: t voidaan tällä hetkellä suorittaa kolmella kielellä: Java, Python, JavaScript ja Ruby. Laajin tuki tarjotaan Java-toiminnoille.





Java UDF: itä voidaan kutsua useilla tavoilla. Yksinkertaisin UDF voi vain laajentaa EvalFuncia, joka vaatii vain exec-toiminnon toteuttamisen. Jokaisen Eval UDF: n on toteutettava tämä. Lisäksi, jos funktio on algebrallinen, se voi toteuttaa Algebraic-käyttöliittymän parantamaan kyselyn suorituskykyä merkittävästi.

UDF: n merkitys sialla:

Pigin avulla käyttäjät voivat yhdistää nykyiset operaattorit omaan tai muiden koodiin UDF: n kautta. Pigin etuna on sen kyky antaa käyttäjien yhdistää operaattorinsa omaan tai muiden koodiin UDF: n kautta. Versiosta 0.7 asti kaikki UDF: t on kirjoitettava Java-muodossa ja toteutettava Java-luokkina. Tämä helpottaa uusien UDF-tiedostojen lisäämistä Pigiin kirjoittamalla Java-luokan ja ilmoittamalla Pigille JAR-tiedostosta.



Possussa itsessään on joitain UDF: itä. Ennen versiota 0.8 se oli hyvin rajoitettu joukko, jossa oli vain tavalliset SQL-aggregaattitoiminnot ja muutama muu. Kohdassa 0.8 lisättiin suuri määrä tavallisia merkkijononkäsittely-, matematiikka- ja kompleksityyppisiä UDF: itä.

Mikä on Piggybank?

Piggybank on kokoelma käyttäjien toimittamia UDF: itä, joka julkaistaan ​​Pigin mukana. Piggybank UDF: t eivät sisälly Pig JAR: iin, joten sinun on rekisteröitävä ne manuaalisesti komentosarjaasi. Voit myös kirjoittaa omia UDF-tiedostojasi tai käyttää muiden käyttäjien kirjoittamia.

Arvioi toiminnot

UDF-luokka laajentaa EvalFunc-luokkaa, joka on kaikkien Eval-toimintojen perusta. Kaikki arviointitoiminnot laajentavat Java-luokan ’org.apache.pig.EvalFunc. ”Se on parametroitu UDF: n palautustyypillä, joka on tässä tapauksessa Java-merkkijono. Tämän luokan ydinmenetelmä on ”exec”. Koodin ensimmäinen rivi osoittaa, että funktio on osa myudfs-pakettia.



Se vie yhden tietueen ja palauttaa yhden tuloksen, joka kutsutaan jokaisesta tietueesta, joka kulkee toteutusputken läpi. Tarvitaan kaksoislehti, joka sisältää kaikki kentät, jotka komentosarja välittää UDF: lle syötteenä. Sitten se palauttaa tyypin, jolla olet parametroinut EvalFuncin.

Tätä toimintoa käytetään jokaisessa tuloputkessa. Funktion tulo on sekoitus, jossa on syöttöparametrit siinä järjestyksessä kuin ne välitetään Pig-komentosarjan funktiolle. Alla olevassa esimerkissä funktio ottaa merkkijonon syötteenä. Seuraava funktio muuntaa merkkijonon pienistä isoiksi. Nyt kun toiminto on otettu käyttöön, se on koottava ja sisällytettävä JAR: iin.

c c #: n ja c ++: n välinen ero
package myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER laajentaa EvalFunc {public String exec (Tuple-syöttö) heittää IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {heittää uusi IOException ('kiinniotettu poikkeuksen käsittely syöttörivi', e)}}}

Kokoomatoiminnot:

Kokonaisfunktiot ovat toinen yleinen Eval-toiminnon tyyppi. Kokoomatoimintoja käytetään yleensä ryhmiteltyihin tietoihin. Kokonaisfunktio ottaa pussin ja palauttaa skalaarisen arvon. Mielenkiintoinen ja arvokas piirre monille aggregaattitoiminnoille on, että ne voidaan laskea asteittain hajautetulla tavalla. Hadoop-maailmassa tämä tarkoittaa, että osittaiset laskelmat voidaan tehdä Map and Combiner -laitteella ja lopullinen tulos voidaan laskea Reducer-toiminnolla.

On erittäin tärkeää varmistaa, että algebralliset aggregaattitoiminnot toteutetaan sellaisenaan. Tämän tyyppisiä esimerkkejä ovat sisäänrakennettu COUNT, MIN, MAX ja AVERAGE.

KREIVI on esimerkki algebrallisesta funktiosta, jossa voimme laskea elementtien lukumäärän tietojen osajoukossa ja laskea sitten yhteen laskelmat lopullisen tuotoksen tuottamiseksi. Tarkastellaan COUNT-toiminnon toteutusta:

public class COUNT laajentaa EvalFunc toteuttaa Algebraic {public Long exec (Tuplen syöttö) heittää 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 ()} staattinen julkinen luokka Initial extends EvalFunc {public Tuple exec (Tuple input) heittää IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} staattinen julkinen luokka Intermed laajentaa EvalFuncia {public Tuple exec (Tuple input) heittää IOException {return TupleFactory.getInstance (). newTuple (summa (input))}} staattinen public class Final laajentaa EvalFunc {public Tuple exec (Tuple input) -heittoja IOException {return summa (input)}} staattisesti suojattu Pitkä määrä (Tuplen tulo) heittää ExecException {Object values ​​= input.get (0) if (arvot DataBag) palauttaa ((DataBag) arvot) .size () else if (arvot Map of instance) palauta uudet Long ((((Map) -arvot) .size ())} staattisesti suojattu pitkä summa (Tuple i nput) heittää ExecException, NumberFormatException {DataBag-arvot = (DataBag) input.get (0) pitkä summa = 0 for (Iterator (Tuple) it = arvot.iterator () it.hasNext ()) {Tuple t = it.next ( ) summa + = (pitkä) t.get (0)} tuotto summa}}

COUNT toteuttaa Algebraic-käyttöliittymän, joka näyttää tältä:

julkinen käyttöliittymä Algebraic {public String getInitial () public String getIntermed () public String getFinal ()}

Jotta funktio olisi algebrallinen, sen on toteutettava algebrallinen käyttöliittymä, joka koostuu kolmen EvalFuncista johdetun luokan määrittelystä. Sopimus on, että Initial-luokan suoritusfunktio kutsutaan kerran ja siirretään alkuperäiselle syöttöparille. Sen tulos on sekoitus, joka sisältää osittaisia ​​tuloksia. Intermed-luokan exec-funktiota voidaan kutsua nollaksi tai useammaksi kertaa, ja sen syötteeksi otetaan dupletti, joka sisältää Initial-luokan tai Intermed-luokan aikaisempien kutsumisten tuottamat osittaiset tulokset ja tuottaa sekvenssin toisen osittaisen tuloksen kanssa. Lopuksi kutsutaan Final-luokan exec-funktio, joka antaa lopputuloksen skalaarityypiksi.

Suodatintoiminnot:

Suodatintoiminnot ovat Eval-funktioita, jotka palauttavat loogisen arvon. Sitä voidaan käyttää missä tahansa Boolen lausekkeessa, mukaan lukien FILTER-operaattori tai Bincond-lauseke. Apache Pig ei tue Boolea kokonaan, joten suodatintoimintoja ei voi esiintyä esimerkiksi Foreach-lauseissa, joissa tulokset tulostetaan toiselle operaattorille. Suodatintoimintoja voidaan kuitenkin käyttää suodatinlausekkeissa.

Alla oleva esimerkki toteuttaa IsEmpty-toiminnon:

Tuo java.io.IOException Tuo java.util.Kartta Tuo org.apache.pig.FilterFunc Tuo org.apache.pig.PigException Tuo org.apache.pig.backend.executionengine.ExecException Tuo org.apache.pig.data.DataBag import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * Selvitä, onko laukku tai kartta tyhjä. * / public class IsEmpty laajentaa FilterFunc {@Override public Boolean exec (Tuple-tulo) heittää IOException {kokeile {Object values ​​= input.get (0) if (arvot DataBag) palauttaa ((DataBag) arvot) .size () == 0 muuta, jos (mapin arvot) palauttaa ((kartta) arvot) .size () == 0 muu {int errCode = 2102 Merkkijono msg = '+ + DataType.findTypeName (arvot) +' -testiä ei voida tyhjentää. ' heittää uusi ExecException (msg, errCode, PigException.BUG)}} kiinni (ExecException ee) {heittää ee}}}