Apache Pig UDF: Partea 2 - Funcții de încărcare



Această postare descrie despre Apache Pig UDF - Funcții de încărcare. (Apache Pig UDF: Partea 2). Aruncați o privire la funcțiile de încărcare ale Apache Pig UDF.

Postarea de astăzi este despre funcțiile de încărcare din Apache Pig. Aceasta este continuarea prima postare care acoperea funcțiile UDF precum Eval, Filter și Aggregate. Vă rugăm să consultați acestea pentru mai multe informații despre alte funcții ale Pig UDF.





Funcția de încărcare a porcului este construită deasupra InputFormatului unui Hadoop, clasa pe care Hadoop o folosește pentru a citi datele. InputFormat are două scopuri: Determină modul în care intrarea va fi fragmentată între sarcinile de hartă și oferă un RecordReader care are ca rezultat perechi cheie-valoare ca intrare în acele sarcini de hartă. Clasa de bază pentru funcția de încărcare este LoadFunc.

Funcția de încărcare - Clasificare:

Clasa abstractă LoadFunc are trei metode principale pentru încărcarea datelor și în majoritatea cazurilor de utilizare ar fi suficient să o extindeți. Există alte trei interfețe opționale care pot fi implementate pentru a obține funcționalități extinse:



  • LoadMetadata:

LoadMetadata are metode pentru a face față metadatelor. Majoritatea execuției încărcătoarelor nu trebuie să implementeze acest lucru decât dacă interacționează cu un sistem de metadate. Metoda getSchema () din această interfață oferă o modalitate prin care implementările încărcătorului pot comunica despre schema datelor înapoi către Pig. Dacă o implementare a încărcătorului returnează date formate din câmpuri de tipuri reale, ar trebui să furnizeze schema care descrie datele returnate prin metoda getSchema (). Celelalte metode tratează alte tipuri de metadate, cum ar fi cheile de partiție și statisticile. Implementările pot returna valori de returnare nule pentru aceste metode dacă nu sunt valabile pentru cealaltă implementare.

  • LoadPushDown:

LoadPushDown are diferite metode pentru a împinge operațiunile de la runtime Pig la implementările încărcătorului. În prezent, doar metoda pushProjection () este apelată de Pig pentru a comunica încărcătorului, câmpurile exacte care sunt necesare în scriptul Pig. Implementarea încărcătorului poate alege să respecte sau să nu respecte cererea. Dacă implementarea încărcătorului decide să respecte cererea, ar trebui să implementeze LoadPushDown pentru a îmbunătăți performanța interogării.

  • pushProjection ():

Această metodă informează LoadFunc, care câmpuri sunt necesare în scriptul Pig. Astfel, LoadFunc poate îmbunătăți performanța încărcând numai câmpurile necesare. pushProjection () are un ‘requiredFieldList.’ ‘requiredFieldList’ este doar citit și nu poate fi modificat de LoadFunc. „RequiredFieldList” include o listă de „requiredField”, în care fiecare „requiredField” indică un câmp cerut de scriptul Pig și este alcătuit din index, alias, tip și subcâmpuri. Pig folosește indexul de coloană requiredField.index pentru a comunica cu LoadFunc despre câmpurile cerute de scriptul Pig. Dacă câmpul obligatoriu este o hartă, Pig va trece la ‘requiredField.subFields’ care conține o listă de chei cerute de scripturile Pig pentru hartă.



  • LoadCaster:

LoadCaster are tehnici de conversie a matricilor de octeți în tipuri specifice. O implementare a încărcătorului ar trebui să pună în aplicare acest lucru atunci când ar trebui să fie acceptate proiectări implicite sau explicite din câmpurile DataByteArray către alte tipuri.

Clasa abstractă LoadFunc este principala clasă de extins pentru implementarea unui încărcător. Metodele care trebuie înlocuite sunt explicate mai jos:

  • getInputFormat ():

    Această metodă este apelată de Pig pentru a obține InputFormat utilizat de încărcător. Metodele din InputFormat sunt apelate de Pig în același mod ca Hadoop într-un program Java MapReduce. Dacă InputFormat este unul Hadoop ambalat, implementarea ar trebui să utilizeze noul API bazat pe org.apache.hadoop.mapreduce. Dacă este un InputFormat personalizat, este mai bine să fie implementat folosind noul API în org.apache.hadoop.mapreduce.

  • setLocation ():

    Această metodă este apelată de Pig pentru a comunica locația de încărcare încărcătorului. Încărcătorul trebuie să utilizeze această metodă pentru a comunica aceleași informații către InputFormat de bază. Această metodă este numită de mai multe ori de către porc.

  • prepareToRead ():

    În această metodă, RecordReader-ul legat de InputFormat furnizat de LoadFunc este trecut la LoadFunc. RecordReader poate fi utilizat acum de implementarea în getNext () pentru a returna un tuplu reprezentând o înregistrare a datelor înapoi către Pig.

  • getNext ():

    Semnificația getNext () nu s-a schimbat și este apelată de Runtime Pig pentru a obține următorul tuplu din date. În această metodă, implementarea ar trebui să utilizeze RecordReader-ul de bază și să construiască tuplul pentru a reveni.

Implementări implicite în LoadFunc:

Rețineți că implementările implicite din LoadFunc ar trebui să fie suprascrise numai atunci când este necesar.

ce este filtrul contextual în tablou
  • setUdfContextSignature ():

    Această metodă va fi apelată de Pig, atât în ​​partea din față, cât și din partea din spate pentru a transmite o semnătură unică încărcătorului. Semnătura poate fi utilizată pentru a stoca orice informații în UDFContext pe care Loader trebuie să le stocheze între diverse invocații de metodă din partea frontală și cea din spate. Un caz de utilizare este stocarea RequiredFieldList transmisă acestuia în LoadPushDown.pushProjection (RequiredFieldList) pentru utilizare în partea din spate înainte de returnarea tuplurilor în getNext (). Implementarea implicită în LoadFunc are un corp gol. Această metodă va fi apelată înainte de alte metode.

  • relativeToAbsolutePath ():

    Runtime-ul porcului va apela această metodă pentru a permite încărcătorului să convertească o locație relativă de încărcare într-o locație absolută. Implementarea implicită furnizată în LoadFunc gestionează acest lucru pentru locațiile FileSystem. Dacă sursa de încărcare este altceva, implementarea încărcătorului poate alege să înlocuiască acest lucru.

Implementarea încărcătorului din exemplu este un încărcător pentru date text cu delimitator de linie ca „
„Și„ „ca delimitator de câmp implicit similar cu încărcătorul actual PigStorage din Pig. Implementarea folosește un Inputformat existent acceptat de Hadoop - TextInputFormat - ca InputFormat de bază.

public class SimpleTextLoader extinde LoadFunc {protected RecordReader in = null private byte fieldDel = 'private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {}} Încărcător de porci care folosește caracterul specificat ca delimitator de câmp. * * @param delimiter * caracterul de octet unic care este utilizat pentru a separa câmpurile. * ('' este valoarea implicită.) * / public SimpleTextLoader (String delimiter) {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 (delimiter.substring (2), 16) .byteValue () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break implicit: aruncă nou RuntimeException ('Delimitator necunoscut' + delimitator)}} else {aruncă RuntimeException nou ('Delimetrul PigStorage trebuie să fie un singur caracter')}} @Override public Tuple getNext () aruncă IOException {încercați {boolean notDone = in.nextKeyValue () (notDone) {return null} Text value = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iAi o întrebare pentru noi? Vă rugăm să o menționați în secțiunea de comentarii și vă vom răspunde. 

Postări asemănatoare: