Apache Pig UDF: Časť 2 - Funkcie načítania



Tento príspevok popisuje funkcie Apache Pig UDF - načítanie. (Apache Pig UDF: časť 2). Zoznámte sa s funkciami načítania Apache Pig UDF.

Dnešný príspevok sa týka funkcií Load v aplikácii Apache Pig. Toto je pokračovanie prvý príspevok ktoré pokrývali funkcie UDF ako Eval, Filter a Aggregate. Pre viac informácií o ďalších funkciách Pig UDF im prosím vyhľadajte.





Funkcia načítania ošípanej je postavená na vrchu vstupného formátu Hadoopu InputFormat, triedy, ktorú Hadoop používa na čítanie údajov. InputFormat má dva účely: Určuje, ako bude vstup fragmentovaný medzi úlohami mapy, a poskytuje RecordReader, ktorého výsledkom sú páry kľúč - hodnota ako vstup do týchto úloh mapy. Základná trieda pre funkciu načítania je LoadFunc.

Funkcia zaťaženia - klasifikácia:

Abstraktná trieda LoadFunc má tri hlavné spôsoby načítania údajov a vo väčšine prípadov ich stačí rozšíriť. Existujú tri ďalšie voliteľné rozhrania, ktoré je možné implementovať na dosiahnutie rozšírenej funkčnosti:



čo je čítačka s medzipamäťou
  • LoadMetadata:

LoadMetadata má metódy na prácu s metadátami. Väčšina prevedení nakladačov to nemusí implementovať, pokiaľ interagujú so systémom metadát. Metóda getSchema () v tomto rozhraní ponúka spôsob, ako môžu implementácie nakladača komunikovať o schéme údajov späť do programu Pig. Ak implementácia zavádzača vráti údaje zložené z polí skutočných typov, mala by poskytnúť schému popisujúcu údaje vrátené metódou getSchema (). Ostatné metódy sa zaoberajú inými typmi metadát, ako sú kľúče oddielov a štatistika. Implementácie môžu pre tieto metódy vrátiť nulové návratové hodnoty, ak nie sú platné pre inú implementáciu.

  • LoadPushDown:

LoadPushDown má rôzne metódy na tlačenie operácií z runtime Pig do implementácií nakladača. V súčasnosti program Pig na komunikáciu s nakladačom volá iba metódu pushProjection (), presné polia, ktoré sú vyžadované v skripte Pig. Implementácia zavádzača sa môže rozhodnúť žiadosti vyhovieť alebo nie. Ak sa implementácia zavádzača rozhodne žiadosti vyhovieť, mala by implementovať LoadPushDown na zlepšenie výkonu dotazu.

  • pushProjection ():

Táto metóda informuje LoadFunc, ktoré polia sú povinné v skripte Pig. Umožní sa tak funkcii LoadFunc zvýšiť výkon načítaním iba požadovaných polí. pushProjection () má „requiredFieldList“. „requiredFieldList“ je iba na čítanie a nemôže byť zmenený pomocou LoadFunc. „RequiredFieldList“ obsahuje zoznam „requiredField“, kde každý „requiredField“ označuje pole požadované skriptom Pig a obsahuje index, alias, typ a podriadené polia. Pig používa index stĺpca requiredField.index na komunikáciu s funkciou LoadFunc o poliach požadovaných skriptom Pig. Ak je požadovaným poľom mapa, Pig odovzdá súbor „requiredField.subFields“, ktorý obsahuje zoznam kľúčov vyžadovaných skriptmi Pig pre mapu.



je postgraduálny a ovláda to isté
  • LoadCaster:

LoadCaster má techniky na prevod bajtových polí na konkrétne typy. Implementácia zavádzača by to mala implementovať, keď je potrebné podporovať implicitné alebo explicitné prenášanie z polí DataByteArray na iné typy.

Abstraktná trieda LoadFunc je hlavnou triedou, ktorú je možné rozšíriť o implementáciu zavádzača. Ďalej sú vysvetlené metódy, ktoré je potrebné potlačiť:

ako obrátiť číslo v jave
  • getInputFormat ():

    Túto metódu volá Pig, aby získal InputFormat využívaný zavádzačom. Metódy v InputFormat nazýva Pig rovnakým spôsobom ako Hadoop v programe MapReduce Java. Ak je InputFormat zabalený v Hadoop, implementácia by mala používať nové založené na API, pod org.apache.hadoop.mapreduce. Ak je to vlastný InputFormat, je lepšie ho implementovať pomocou nového API v org.apache.hadoop.mapreduce.

  • setLocation ():

    Túto metódu nazýva Pig na komunikáciu miesta zaťaženia s nakladačom. Zavádzač musí touto metódou komunikovať rovnaké informácie s hlavným vstupným formátom. Túto metódu ošípané nazýva viackrát.

  • prepareToRead ():

    V tejto metóde sa RecordReader súvisiaci s InputFormatom poskytnutým funkciou LoadFunc odovzdá aplikácii LoadFunc. RecordReader môže teraz implementácia v getNext () použiť na vrátenie n-tice predstavujúcej záznam údajov späť do Pig.

  • getNext ():

    Význam getNext () sa nezmenil a je volaný Pig runtime na získanie ďalšej n-tice v dátach. V tejto metóde by implementácia mala používať podkladový RecordReader a vytvoriť n-ticu, ktorá sa má vrátiť.

Predvolené implementácie v LoadFunc:

Berte na vedomie, že predvolené implementácie v LoadFunc by mali byť prepísané iba v prípade potreby.

  • setUdfContextSignature ():

    Túto metódu zavolá Pig, a to na prednom aj zadnom konci, aby odovzdal jedinečný podpis nakladaču. Podpis je možné použiť na uloženie akýchkoľvek informácií do UDFContext, ktoré Loader potrebuje na uloženie medzi rôznymi vyvolanými metódami v klientskom rozhraní a zadnom rozhraní. Prípadom použitia je uloženie RequiredFieldList, ktorý sa mu odovzdal, v LoadPushDown.pushProjection (RequiredFieldList) na použitie v zadnom konci pred vrátením n-tíc v getNext (). Predvolená implementácia v LoadFunc má prázdne telo. Táto metóda sa bude volať pred inými metódami.

  • relativeToAbsolutePath ():

    Prasací runtime zavolá túto metódu, aby umožnil zavádzaču prevádzať relatívne miesto zaťaženia na absolútne miesto. Predvolená implementácia poskytnutá v LoadFunc to zvláda pre umiestnenia FileSystem. Ak je zdrojom načítania niečo iné, implementácia zavádzača sa môže rozhodnúť toto prepísať.

Implementáciou zavádzača v príklade je zavádzač textových údajov s oddeľovačom riadkov ako „
„A“ „ako predvolený oddeľovač polí podobný súčasnému zavádzaču PigStorage v Pig. Implementácia používa ako základný InputFormat existujúci Inputformat - TextInputFormat podporovaný Hadoop.

verejná trieda SimpleTextLoader rozširuje LoadFunc {chránený RecordReader v = null súkromné ​​bajtové poleDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {} {/ Nakladač ošípaných, ktorý používa zadaný znak ako oddeľovač polí. * * @param delimiter * jednobajtový znak, ktorý sa používa na oddelenie polí. * („je predvolené.) * / public SimpleTextLoader (Oddeľovač reťazcov) {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 () prípad prerušenia 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () zlomiť predvolené: hodiť nový RuntimeException ('Unknown delimiter' + delimiter)}} else {throw new RuntimeException ('' PigStorage delimeter must be a single character ')}} @Override public Tuple getNext () throws IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} Textová hodnota = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 pre (int i = 0 iMáte na nás otázku? Uveďte to prosím v sekcii komentárov a my sa vám ozveme. 

Súvisiace príspevky: