Apache Pig UDF: 1. rész - Kiértékelési, összesítési és szűrési funkciók



Ez a bejegyzés az Apache Pig UDF - kiértékelési, összesítési és szűrési funkciókról szól. Vessen egy pillantást az Eval, Aggregate & Filter függvényekre.

megtalálja a tömb javascript hosszát

Az Apache Pig széles körű támogatást nyújt a felhasználó által definiált funkciókhoz (UDF), az egyéni feldolgozás megadásának módjaként. A Pig UDF-ek jelenleg három nyelven hajthatók végre: Java, Python, JavaScript és Ruby. A legszélesebb körű támogatást a Java funkciók nyújtják.





A Java UDF-eket többféle módon lehet meghívni. A legegyszerűbb UDF csak kiterjesztheti az EvalFunc-ot, amihez csak az exec függvény szükséges. Minden Eval UDF-nek ezt végre kell hajtania. Ezenkívül, ha egy függvény algebrai, akkor megvalósíthatja az algebrai interfészt a lekérdezés teljesítményének jelentős javítása érdekében.

Az UDF jelentősége a disznóban:

A Pig lehetővé teszi a felhasználók számára, hogy a meglévő operátorokat egyesítsék saját vagy mások kódjával UDF-eken keresztül. A Pig előnye, hogy lehetővé teszi a felhasználók számára, hogy UDF-en keresztül egyesítsék operátorait saját vagy mások kódjával. A 0.7-es verzióig minden UDF-et Java-ban kell írni, és Java-osztályként kell megvalósítani. Ez megkönnyíti az új UDF-ek hozzáadását a Pig-hez egy Java osztály megírásával és Pig értesítésével a JAR fájlról.



Maga a disznó néhány UDF-rel érkezik. A 0.8-as verzió előtt nagyon korlátozott készlet volt, csak a standard SQL összesítő függvényekkel és néhány mással. A 0.8-ban nagy számú szabványos karakterlánc-feldolgozó, matematikai és komplex típusú UDF került hozzáadásra.

Mi az a Piggybank?

A Piggybank a felhasználók által közreműködő UDF-ek gyűjteménye, amelyet Pig mellett adnak ki. A Piggybank UDF-eket nem tartalmazza a Pig JAR, ezért manuálisan kell regisztrálnia őket a szkriptben. Ön is írhat saját UDF-eket, vagy használhatja azokat, amelyeket más felhasználók írtak.

Értékelje a függvényeket

Az UDF osztály kiterjeszti az EvalFunc osztályt, amely az összes Eval függvény alapja. Az összes kiértékelési funkció kiterjeszti a Java osztály ’org.apache.pig.EvalFunc. ’Az UDF visszatérési típusával van paraméterezve, amely ebben az esetben Java karakterlánc. Ebben az osztályban az alapvető módszer az „exec”. A kód első sora azt jelzi, hogy a függvény a myudfs csomag része.



Egy rekordra van szükség, és egy eredményt ad vissza, amelyet minden végrehajtási folyamaton áthaladó rekordra meghívunk. Szüksége van egy duplára, amely tartalmazza az összes mezőt, amelyet a szkript átad az UDF-nek bemenetként. Ezután visszaadja azt a típust, amellyel az EvalFunc-ot paraméterezte.

Ezt a funkciót minden bemeneti duplán meghívják. A függvény bemenete egy pár, bemeneti paraméterekkel, abban a sorrendben, ahogyan a Pig szkriptben a funkcióhoz továbbítják. Az alábbi példában a függvény karakterláncot vesz be. A következő függvény átalakítja a karakterláncot kisbetűből nagybetűvé. Most, hogy a függvény megvalósult, össze kell állítani és be kell foglalni egy JAR-ba.

javascript események listája példákkal
csomag myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class Az UPPER kiterjeszti az EvalFunc {public String exec (Tuple input) dobja az IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (e Kivétel) {dob új IOException ('Elfogott kivétel feldolgozza a bemeneti sort', e)}}}

Összesített funkciók:

Az összesített függvények az Eval függvények másik gyakori típusa. Az összesített függvényeket általában a csoportosított adatokra alkalmazzák. Az összesített függvény vesz egy zsákot, és egy skaláris értéket ad vissza. Számos összesített funkció érdekes és értékes tulajdonsága, hogy elosztott módon inkrementálisan számolhatók. A Hadoop világban ez azt jelenti, hogy a részszámításokat a Map és a Combiner végezheti el, a végeredményt pedig a Reducer számíthatja ki.

Nagyon fontos megbizonyosodni arról, hogy az algebrai aggregált függvények mint ilyenek megvalósításra kerülnek-e. Ilyen típus például a beépített COUNT, MIN, MAX és ÁTLAG.

SZÁMOL egy példa egy algebrai függvényre, ahol megszámolhatjuk az adatok egy részhalmazában lévő elemek számát, majd összegezhetjük a számokat egy végső kimenet előállításához. Nézzük meg a COUNT függvény megvalósítását:

a COUNT nyilvános osztály kiterjeszti az EvalFunc-t, az Algebraic {public Long exec (Tuple input) dobja az 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 ()} statikus nyilvános osztály Kezdeti kiterjesztése EvalFunc {public Tuple exec (Tuple bevitel) dobja az IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} statikus nyilvános osztály Intermed kiterjeszti az EvalFunc-ot {public Tuple exec (Tuple input) IOException dobja {return TupleFactory.getInstance (). newTuple (sum (input))}} statikus public class Final kiterjeszti EvalFunc {public Tuple exec (Tuple input) dob IOException {return sum (input)}} statikusan védett Long count (Tuple input) dobja az ExecException {Object values ​​= input.get (0) if (a DataBag értékei értékek) visszatérnek ((DataBag) értékek). Size () else if (értékek Map példája) adja vissza az új Long (((Map) értékeket) .size ())} statikusan védett hosszú összeget (Tuple i nput) dobja az ExecException, NumberFormatException {DataBag értékek = (DataBag) input.get (0) hosszú összeget = 0 az (Iterator (Tuple) it = értékek.iterator () it.hasNext ()) {Tuple t = it.next ( ) összeg + = (hosszú) t.get (0)} visszatérési összeg}}

A COUNT megvalósítja az algebrai interfészt, amely így néz ki:

nyilvános felület Algebrai {public String getInitial () public String getIntermed () public String getFinal ()}

Ahhoz, hogy egy függvény algebrai legyen, olyan algebrai interfészt kell megvalósítania, amely három, az EvalFunc-ból származtatott osztály meghatározásából áll. A szerződés az, hogy az Initial osztály execfunction-ja egyszer meghívásra kerül, és átkerül az eredeti bemeneti duplához. Kimenete egy pár, amely részeredményeket tartalmaz. Az Intermed osztály exec függvényét nulla vagy többször is hívhatjuk, és bemenetként egy olyan duplát veszünk, amely az Initial osztály vagy az Intermed osztály korábbi meghívásai által létrehozott részeredményeket tartalmaz, és egy másik részeredménnyel duplát állít elő. Végül meghívjuk a Final osztály exec függvényét, amely skaláris típusként adja meg a végeredményt.

Szűrési funkciók:

A szűrőfüggvények azok az Eval függvények, amelyek logikai értéket adnak vissza. Bárhol használható, ha egy logikai kifejezés megfelelő, beleértve a FILTER operátort vagy a Bincond kifejezést. Az Apache Pig nem támogatja teljesen a Boole-ot, így a szűrőfüggvények nem jelenhetnek meg az olyan utasításokban, mint például a „Foreach”, ahol az eredményeket egy másik operátor adja ki. A szűrőfunkciók azonban felhasználhatók a szűrő utasításokban.

Az alábbi példa az IsEmpty függvényt valósítja meg:

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 / ** * Határozza meg, hogy a táska vagy a térkép üres-e. * / public class IsEmpty extends FilterFunc {@Orride public Booleean exec (Tuple input) override IOException {try {Object values ​​= input.get (0) if (A DataBag értékei visszatérnek ((DataBag) értékek) .size () == 0 else if (a Map instance értékei) visszatérnek ((Map) értékekhez) .size () == 0 else {int errCode = 2102 String msg = 'Nem lehet tesztelni a + DataType.findTypeName (értékek) +' ürességét. ' dobj új ExecException-t (msg, errCode, PigException.BUG)}} catch (ExecException ee) {dob ee}}}