Apache Pig UDF: Dio 2 - Funkcije učitavanja



Ovaj post opisuje UDF Apache Pig - funkcije učitavanja. (Apache Pig UDF: 2. dio). Pogledajte funkcije učitavanja Apache Pig UDF.

Današnji post govori o funkcijama Load u Apache Pig. Ovo je nastavak prvi post koja je pokrivala funkcije UDF-a poput Eval, Filter i Aggregate. Molimo kontaktirajte ih za više informacija o ostalim funkcijama Svinjskog UDF-a.





Funkcija učitavanja svinja izgrađena je na vrhu Hadoop-ovog InputFormat-a, klase koju Hadoop koristi za čitanje podataka. InputFormat ima dvije svrhe: Određuje kako će unos biti fragmentiran između zadataka mape i pruža RecordReader koji rezultira parovima ključ / vrijednost kao ulaz u te zadatke karte. Osnovna klasa za funkciju opterećenja je LoadFunc.

Funkcija opterećenja - Klasifikacija:

Sažetak klase LoadFunc ima tri glavne metode za učitavanje podataka i u većini slučajeva bilo bi dovoljno proširiti ih. Postoje tri dodatna sučelja koja se mogu implementirati za postizanje proširene funkcionalnosti:



  • LoadMetadata:

LoadMetadata ima metode za obradu metapodataka. Većina izvršenja loader-a to ne treba provesti ako ne komuniciraju sa sustavom metapodataka. Metoda getSchema () u ovom sučelju nudi način za implementacije loader-a da komuniciraju o shemi podataka natrag na Pig. Ako implementacija učitavača vrati podatke koji se sastoje od polja stvarnih tipova, trebala bi pružiti shemu koja opisuje podatke vraćene metodom getSchema (). Ostale se metode bave drugim vrstama metapodataka poput particijskih ključeva i statistike. Implementacije mogu vratiti nule povratne vrijednosti za ove metode ako nisu valjane za drugu implementaciju.

  • LoadPushDown:

LoadPushDown ima različite metode za guranje operacija iz Pig runtimea u implementacije loader-a. Trenutno Pig poziva samo metodu pushProjection () da bi komunicirao s utovarivačem, točna polja koja su potrebna u Pig skripti. Implementacija loader-a može odabrati hoće li se pridržavati zahtjeva ili ga neće ispunjavati. Ako implementacija loader-a odluči poštivati ​​zahtjev, trebala bi implementirati LoadPushDown kako bi poboljšala izvedbu upita.

  • pushProjection ():

Ova metoda informira LoadFunc, koja su polja obavezna u Pig skripti. Tako omogućava LoadFunc da poboljša performanse učitavanjem samo potrebnih polja. pushProjection () uzima 'requiredFieldList.' 'requiredFieldList' je samo za čitanje i LoadFunc ga ne može promijeniti. 'RequiredFieldList' uključuje popis 'requiredField', gdje svako 'requiredField' označava polje koje zahtijeva Pig skripta, a sastoji se od indeksa, zamjenskog imena, vrste i potpolja. Svinja koristi indeks stupaca requiredField.index za komunikaciju s LoadFuncom o poljima koja su potrebna u Pig skripti. Ako je potrebno polje mapa, Svinja će proslijediti ‘requiredField.subFields’ koja sadrži popis ključeva potrebnih Pig skriptama za kartu.



  • LoadCaster:

LoadCaster ima tehnike pretvaranja bajt polja u određene tipove. Implementacija loader-a to bi trebala implementirati kada treba podržati implicitna ili eksplicitna premještanja iz polja DataByteArray u druge tipove.

Apstraktna klasa LoadFunc glavna je klasa koju treba proširiti za implementaciju loader-a. Metode koje je potrebno nadjačati objašnjene su u nastavku:

prednosti preopterećenja metode u javi
  • getInputFormat ():

    Ovu metodu poziva Pig da bi dobio InputFormat koji koristi loader. Metode u InputFormat-u Pig poziva na isti način kao i Hadoop u Java MapReduce programu. Ako je InputFormat paket s Hadoop-om, implementacija bi trebala koristiti novi API zasnovan pod org.apache.hadoop.mapreduce. Ako je to prilagođeni InputFormat, bolje je implementirati pomoću novog API-ja u org.apache.hadoop.mapreduce.

  • setLocation ():

    Ovu metodu poziva Pig da bi utovarivaču priopćio mjesto opterećenja. Utovarivač mora koristiti ovu metodu za priopćavanje istih podataka jezgri InputFormat. Ovu metodu svinja više puta naziva.

  • pripremaToRead ():

    U ovoj se metodi RecordReader koji se odnosi na InputFormat koji pruža LoadFunc prenosi na LoadFunc. RecordReader sada može koristiti implementacija u getNext () za vraćanje korpe koja predstavlja zapis podataka natrag u Pig.

  • getNext ():

    Značenje getNext () nije se promijenilo i Pig runtime ga poziva da prikupi sljedeću gomilu podataka. U ovoj metodi, implementacija bi trebala koristiti temeljni RecordReader i konstruirati tuple za povratak.

Zadane implementacije u LoadFunc:

Imajte na umu da bi zadane implementacije u LoadFuncu trebalo nadjačati samo kada je to potrebno.

  • setUdfContextSignature ():

    Ovu će metodu pozvati Pig, i na prednjem i na stražnjem kraju kako bi proslijedio jedinstveni potpis Loaderu. Potpis se može koristiti za spremanje bilo kakvih podataka u UDFContext koje Loader treba pohraniti između različitih poziva metoda u prednjem i stražnjem kraju. Slučaj upotrebe je pohranjivanje RequiredFieldList-a koji mu je proslijeđen u LoadPushDown.pushProjection (RequiredFieldList) za upotrebu na stražnjem kraju prije vraćanja korpica u getNext (). Zadana implementacija u LoadFunc ima prazno tijelo. Ova će se metoda pozvati prije ostalih metoda.

  • relativeToAbsolutePath ():

    Vrijeme izvođenja svinja pozvat će ovu metodu kako bi Loaderu omogućilo pretvaranje relativnog mjesta opterećenja u apsolutno mjesto. Zadana implementacija osigurana u LoadFuncu to rješava za lokacije FileSystema. Ako je izvor učitavanja nešto drugo, implementacija loader-a može to odlučiti poništiti.

Implementacija loader-a u primjeru je loader za tekstualne podatke s graničnikom reda kao ‘
‘I‘ ‘kao zadani graničnik polja sličan trenutnom PigStorage utovarivaču u Pig-u. Implementacija koristi postojeći Inputformat koji podržava Hadoop - TextInputFormat - kao temeljni InputFormat.

javna klasa SimpleTextLoader proširuje LoadFunc {zaštićeni RecordReader u = null privatni bajt fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoer * Contextstruct (Constructed) Uređaj za svinje koji koristi navedeni znak kao graničnik polja. * * @param graničnik * jednobajtni znak koji se koristi za odvajanje polja. * ('' je zadani.) * / public SimpleTextLoader (Razgraničnik niza) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.charAt (0) == '') {switch (delimiter.charAt (1)) {case 't': this.fieldDel = (byte) '' break case 'x' : fieldDel = Integer.valueOf (graničnik.supstring (2), 16) .byteValue () slučaj sloma 'u': this.fieldDel = Integer.valueOf (graničnik.supstring (2)). byteValue () zadana stanka: baciti novo RuntimeException ('Nepoznati graničnik' + graničnik)}} else {baciti novi RuntimeException ('PigStorage delimeter mora biti jedan znak')}} @Override public Tuple getNext () baca IOException {try {boolean notDone = in.nextKeyValue () (notDone) {return null} Vrijednost teksta = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iImate pitanje za nas? Molimo spomenite to u odjeljku za komentare i javit ćemo vam se. 

Vezane objave: