Apache Pig UDF: 2. del - funkcije nalaganja



Ta objava opisuje funkcijo Apache Pig UDF - Load. (Apache Pig UDF: 2. del). Oglejte si funkcije obremenitve UDF Apache Pig.

Današnja objava govori o funkcijah Load v Apache Pig. To je nadaljevanje prva objava ki je zajemal funkcije UDF, kot so Eval, Filter in Aggregate. Prosimo, obrnite se na njih za več informacij o drugih funkcijah Pig UDF.





Funkcija nalaganja prašičev je zgrajena na vrhu Hadoopovega InputFormat, razreda, ki ga Hadoop uporablja za branje podatkov. InputFormat ima dva namena: Določa, kako bo vnos razdrobljen med opravili zemljevida, in zagotavlja RecordReader, ki ima za posledico pare ključ-vrednost kot vhod v ta opravila zemljevida. Osnovni razred za funkcijo obremenitve je LoadFunc.

Funkcija obremenitve - Razvrstitev:

Abstraktni razred LoadFunc ima tri glavne metode za nalaganje podatkov, v večini primerov pa bi jih bilo dovolj razširiti. Obstajajo še trije neobvezni vmesniki, ki jih je mogoče uporabiti za dosego razširjene funkcionalnosti:



ruby on rails trg dela
  • LoadMetadata:

LoadMetadata ima metode za obdelavo metapodatkov. Večini izvedb nalagalnikov tega ni treba izvesti, razen če so v interakciji s sistemom metapodatkov. Metoda getSchema () v tem vmesniku ponuja način, kako izvedbe nakladalca komunicirajo o shemi podatkov nazaj na Pig. Če izvedba nalagalnika vrne podatke, sestavljene iz polj resničnih tipov, mora zagotoviti shemo, ki opisuje podatke, vrnjene z metodo getSchema (). Druge metode se ukvarjajo z drugimi vrstami metapodatkov, kot so particijski ključi in statistika. Izvedbe lahko vrnejo ničelne vrednosti vrnitve za te metode, če niso veljavne za drugo izvedbo.

  • LoadPushDown:

LoadPushDown ima različne metode za potiskanje operacij iz časa izvajanja Pig v izvedbe nakladalnika. Trenutno Pig pokliče samo metodo pushProjection (), ki sporoča nalagalniku, natančna polja, ki so potrebna v skriptu Pig. Izvajalec nalagalnika se lahko odloči, ali bo upošteval zahtevo. Če se izvedba nalagalnika odloči, da bo upoštevala zahtevo, mora za izboljšanje učinkovitosti poizvedbe implementirati LoadPushDown.

  • pushProjection ():

Ta metoda obvesti LoadFunc, katera polja so obvezna v skriptu Pig. Tako lahko LoadFunc izboljša zmogljivost tako, da naloži samo potrebna polja. pushProjection () vzame 'requiredFieldList.' 'requiredFieldList' je samo za branje in ga LoadFunc ne more spremeniti. „RequiredFieldList“ vključuje seznam „requiredField“, kjer vsako „requiredField“ označuje polje, ki ga zahteva skripta Pig, in je sestavljeno iz indeksa, vzdevka, vrste in podpolj. Pig uporablja indeks stolpcev requiredField.index za komunikacijo z LoadFunc o poljih, ki jih zahteva skript Pig. Če je obvezno polje zemljevid, bo Pig prenesel 'requiredField.subFields', ki vsebuje seznam ključev, ki jih za zemljevid zahtevajo prašičji skripti.



  • LoadCaster:

LoadCaster ima tehnike pretvorbe bajtnih nizov v določene vrste. Izvedba nalagalnika bi morala to izvesti, kadar je treba podpirati implicitne ali eksplicitne oddaje iz polj DataByteArray v druge vrste.

Abstraktni razred LoadFunc je glavni razred za razširitev nalagalnika. Metode, ki jih je treba razveljaviti, so razložene spodaj:

  • getInputFormat ():

    To metodo pokliče Pig, da dobi vhodni format, ki ga uporablja nalagalnik. Metode v formatu InputFormat pokliče Pig na enak način kot Hadoop v programu Java MapReduce. Če je InputFormat paket Hadoop, mora implementacija uporabiti novega, ki temelji na API-ju, pod org.apache.hadoop.mapreduce. Če gre za InputFormat po meri, je bolje, da ga implementirate z novim API-jem v org.apache.hadoop.mapreduce.

  • setLocation ():

    To metodo pokliče Pig, da naloži nakladalcu lokacijo tovora. Nalagalnik mora uporabiti to metodo za sporočanje istih informacij jedru InputFormat. Prašič to metodo večkrat pokliče.

  • prepaToRead ():

    Pri tej metodi se RecordReader, povezan z InputFormat, ki ga zagotavlja LoadFunc, posreduje LoadFunc. RecordReader lahko zdaj uporabi izvedba v getNext () za vrnitev zavihka, ki predstavlja zapis podatkov, nazaj v Pig.

  • getNext ():

    Pomen getNext () se ni spremenil in ga Pig runtime pokliče, da pridobi naslednji nabor podatkov. Pri tej metodi mora izvedba uporabiti osnovni zapisnik zapisov in zgraditi tuple za vrnitev.

Privzete izvedbe v LoadFunc:

Upoštevajte, da je treba privzete izvedbe v LoadFunc preglasiti le, kadar je to potrebno.

php vstavi v $ tabelo
  • setUdfContextSignature ():

    To metodo bo poklical Pig, tako na sprednjem kot na zadnjem koncu, da bo nalagalniku poslal edinstven podpis. Podpis lahko uporabite za shranjevanje kakršnih koli informacij v UDFContext, ki jih mora Loader shraniti med različnimi klici metode na sprednjem in zadnjem koncu. Primer uporabe je, da se RequiredFieldList, ki mu je bil poslan, shrani v LoadPushDown.pushProjection (RequiredFieldList) za uporabo na zadnji strani, preden se vrnejo nabori v getNext (). Privzeta izvedba v LoadFunc ima prazno telo. Ta metoda bo poklicana pred drugimi metodami.

  • relativeToAbsolutePath ():

    Prašič v času izvajanja bo poklical to metodo, da bo Loader omogočil pretvorbo relativne lokacije tovora v absolutno lokacijo. Privzeta izvedba, predvidena v LoadFunc, to obravnava za lokacije FileSystem. Če je vir nalaganja kaj drugega, lahko izvedba nalagalnika to preglasi.

Izvedba nalagalnika v primeru je nalagalnik besedilnih podatkov z ločevalnikom vrstic kot '
‘In‘ ‘kot privzeti ločilnik polja, podoben trenutnemu nalagalniku PigStorage v Pig. Implementacija uporablja obstoječi podprti Hadoop Inputformat - TextInputFormat - kot osnovni InputFormat.

javni razred SimpleTextLoader razširja LoadFunc {zaščiten RecordReader v = null zasebni bajt fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoer * Contextstruct (Constructed) Nakladalnik prašičev, ki uporablja določen znak kot ločilo polja. * * @param ločilo * enobajtni znak, ki se uporablja za ločevanje polj. * ('' je privzeto.) * / public SimpleTextLoader (Ločilo 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 (ločilo.substring (2), 16) .byteValue () prekinitev primera 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () privzeta prekinitev: vrzi novo RuntimeException ('Neznan ločilo' + ločilo)}} else {vrzi novo RuntimeException ('Delimeter PigStorage mora biti en znak')}} @Override public Tuple getNext () vrže IOException {try {boolean notDone = in.nextKeyValue () (notDone) {return null} Vrednost besedila = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iImate vprašanje za nas? Prosimo, omenite to v oddelku za komentarje in se vam bomo javili. 

Sorodne objave: