Apache Pig UDF: 1. daļa - Funkciju novērtēšana, apkopošana un filtrēšana



Šajā ziņojumā ir aprakstīts par Apache Pig UDF - novērtēšanas, apkopošanas un filtrēšanas funkcijām. Apskatiet funkcijas Funkcijas Novērtēt, apkopot un filtrēt.

transformācijas veids informātikā

Apache Pig nodrošina plašu lietotāja definētu funkciju (UDF) atbalstu kā veidu, kā norādīt pielāgotu apstrādi. Cūku UDF pašlaik var izpildīt trīs valodās: Java, Python, JavaScript un Ruby. Visplašākais atbalsts tiek sniegts Java funkcijām.





Java UDF var izsaukt vairākos veidos. Vienkāršākais UDF var vienkārši paplašināt EvalFunc, kas prasa tikai exec funkcijas ieviešanu. Katram Eval UDF tas ir jāievieš. Turklāt, ja funkcija ir algebriska, tā var ieviest algebrisko saskarni, lai ievērojami uzlabotu vaicājumu veiktspēju.

UDF nozīme cūkā:

Cūka ļauj lietotājiem apvienot esošos operatorus ar savu vai citu kodu, izmantojot UDF. Pig priekšrocība ir tā spēja ļaut lietotājiem apvienot operatorus ar savu vai citu kodu, izmantojot UDF. Līdz 0.7 versijai visiem UDF ir jābūt rakstītiem Java valodā un jāievieš kā Java klases. Tas atvieglo jaunu UDF pievienošanu Pig, uzrakstot Java klasi un informējot Pig par JAR failu.



Cūka pati nāk ar dažiem UDF. Pirms versijas 0.8 tā bija ļoti ierobežota kopa, kurā bija tikai standarta SQL apkopošanas funkcijas un dažas citas. 0.8 laikā tika pievienots liels skaits standarta virkņu apstrādes, matemātikas un kompleksa tipa UDF.

Kas ir Piggybank?

Piggybank ir lietotāju piesaistītu UDF kolekcija, kas tiek izlaista kopā ar Pig. Piggybank UDF nav iekļauti Pig JAR, tāpēc jums tie manuāli jāreģistrē skriptā. Varat arī rakstīt savus UDF vai izmantot citu lietotāju rakstītos.

klases ceļa iestatīšana Java

Novērtēt funkcijas

UDF klase paplašina EvalFunc klasi, kas ir pamats visām Eval funkcijām. Visas novērtēšanas funkcijas paplašina Java klasi ‘org.apache.pig.EvalFunc. ‘Tas tiek parametrizēts ar UDF atgriešanās tipu, kas šajā gadījumā ir Java virkne. Šīs klases galvenā metode ir ‘exec.’ Koda 1. rindiņa norāda, ka funkcija ir daļa no myudfs pakotnes.



Tas aizņem vienu ierakstu un atgriež vienu rezultātu, kas tiks izsaukts par katru ierakstu, kas iet cauri izpildes cauruļvadam. Tas aizņem kopu, kurā ir visi lauki, kurus skripts nodod jūsu UDF kā ievadi. Pēc tam tas atgriež tipu, pēc kura esat parametrizējis EvalFunc.

Šī funkcija tiek izsaukta katrā ievades kopā. Funkcijas ievade ir kopa ar ievades parametriem tādā secībā, kādā tie tiek nodoti funkcijai Pig skriptā. Zemāk parādītajā piemērā funkcija ievada virkni. Šī funkcija pārveido virkni no mazajiem burtiem uz lielajiem. Tagad, kad funkcija ir ieviesta, tā jāapkopo un jāiekļauj JAR.

pakete myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER paplašina EvalFunc {public String exec (Tuple ievade) throws 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 ('Noķerta izņēmuma apstrādes ievades rinda', e)}}}

Kopējās funkcijas:

Apkopotās funkcijas ir vēl viens izplatīts Eval funkciju veids. Grupētajiem datiem parasti tiek piemērotas apkopotās funkcijas. Funkcija Apkopot ņem maisu un atgriež skalāru vērtību. Interesanta un vērtīga daudzu apkopoto funkciju iezīme ir tā, ka tās var pakāpeniski aprēķināt sadalītā veidā. Hadoop pasaulē tas nozīmē, ka daļējos aprēķinus var veikt Map un Combiner, un galīgo rezultātu var aprēķināt Reducer.

Ir ļoti svarīgi pārliecināties, vai apkopotās funkcijas, kas ir algebriskas, tiek ieviestas kā tādas. Šāda veida piemēri ietver iebūvēto COUNT, MIN, MAX un AVERAGE.

COUNT ir algebriskas funkcijas piemērs, kur mēs varam saskaitīt elementu skaitu datu apakškopā un pēc tam summēt skaitļus, lai iegūtu galīgo rezultātu. Apskatīsim COUNT funkcijas ieviešanu:

publiskā klase COUNT paplašina EvalFunc īsteno algebrisko {public Long exec (Tuple ievade) iemet 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 ()} statiskā publiskā klase Initial paplašina EvalFunc {public Tuple exec (Tuple ievade) iemet IOException {return TupleFactory.getInstance (). newTuple (skaits (ievade)) }} statiskā publiskā klase Intermed paplašina EvalFunc {public Tuple exec (Tuple ievade) iemet IOException {return TupleFactory.getInstance (). newTuple (summa (ievade))}}} statiskā publiskā klase Final paplašina EvalFunc {public Tuple exec (Tuple ievade) metieni IOException {return summa (ievade)}} statiski aizsargāta Garā skaita (Tuples ievade) met ExecException {Object values ​​= input.get (0) if (vērtības DataBag vērtības return) ((DataBag) vērtības). Size () else if (vērtības Mapof atgriešana) atgriež jaunas garās (((karte) vērtības). izmērs ())} statiski aizsargāta garā summa (Tuple i nput) izmet ExecException, NumberFormatException {DataBag vērtības = (DataBag) input.get (0) gara summa = 0 par (Iterator (Tuple) it = vērtības.iterator () it.hasNext ()) {Tuple t = it.next ( ) summa + = (Long) t.get (0)} atgriešanās summa}}

COUNT ievieš algebrisko saskarni, kas izskatās šādi:

Kā meklēt rakstzīmi Java
publiskā saskarne Algebraic {public String getInitial () public String getIntermed () public String getFinal ()}

Lai funkcija būtu algebriska, tai jāievieš algebriskā saskarne, kas sastāv no trīs klašu definīcijas, kas iegūtas no EvalFunc. Līgums ir tāds, ka Sākotnējās klases izpildfunkcija tiek izsaukta vienu reizi un tiek nodota sākotnējam ievades kopējam. Tās izeja ir kopa, kas satur daļējus rezultātus. Intermed klases exec funkciju var saukt par nulli vai vairāk reizes, un par savu ievadi ņem kopu, kas satur daļējus rezultātus, ko radījusi Sākotnējā klase vai iepriekšēja Intermed klases izsaukšana, un rada kopu ar citu daļēju rezultātu. Visbeidzot, tiek izsaukta Final klases exec funkcija, kas dod gala rezultātu kā skalāra tipa.

Filtra funkcijas:

Filtra funkcijas ir Eval funkcijas, kas atgriež Būla vērtību. To var izmantot visur, kur ir piemērota Būla izteiksme, ieskaitot FILTER operatoru vai Bincond izteiksmi. Apache Pig pilnībā neatbalsta Būla logu, tāpēc filtra funkcijas nevar parādīties tādos izteikumos kā ‘Foreach’, kur rezultāti tiek izvadīti citam operatoram. Tomēr filtru paziņojumos var izmantot funkcijas Filtrs.

Tālāk sniegtajā piemērā tiek ieviesta funkcija IsEmpty:

importēt java.io.IOException importēt java.util.Map importēt org.apache.pig.FilterFunc importēt org.apache.pig.PigException importēt org.apache.pig.backend.executionengine.ExecException importēt org.apache.pig.data.DataBag importēt org.apache.pig.data.Tuple importēt org.apache.pig.data.DataType / ** * Nosakiet, vai soma vai karte ir tukša. * / public class IsEmpty paplašina FilterFunc {@Orride public Boolean exec (Tuple input) izmet IOException {mēģiniet {Object values ​​= input.get (0) if (vērtības DataBag vērtības atgriež ((DataBag) vērtības). izmērs () == 0 cits, ja (kartes Kartes vērtības) atgriež ((Karte) vērtības). Izmērs () == 0 cits {int errCode = 2102 String msg = 'Nevar pārbaudīt, vai tukšumam nav + DataType.findTypeName (vērtības) +'. ' mest jaunu ExecException (msg, errCode, PigException.BUG)}} noķert (ExecException ee) {mest ee}}}