Apache Pig UDF: Osa 2 - Kuormitustoiminnot



Tämä viesti kuvaa Apache Pig UDF - Lataa -toiminnoista. (Apache Pig UDF: Osa 2). Tutustu Apache Pig UDF: n lataustoimintoihin.

Tämän päivän viesti koskee Apache Pig -sovelluksen lataustoimintoja. Tämä on jatko-osa ensimmäinen viesti joka kattoi UDF-toiminnot, kuten Eval, Filter ja Aggregate. Ole hyvä ja kerro heille saadaksesi lisätietoja Pig UDF: n muista toiminnoista.





Sian kuormitustoiminto on rakennettu Hadoopin InputFormat-luokan päälle, luokka, jota Hadoop käyttää tietojen lukemiseen. InputFormatilla on kaksi tarkoitusta: Se määrittää, miten tulo pirstoutuu karttatehtävien välillä, ja tarjoaa RecordReaderin, joka johtaa avainarvopareihin tulona näihin karttatehtäviin. Kuormitustoiminnon perusluokka on LoadFunc.

yksinkertainen hashmap-toteutus java

Kuormitustoiminto - Luokitus:

LoadFunc-abstraktiluokalla on kolme päämenetelmää tietojen lataamiseen, ja useimmissa käyttötapauksissa riittää sen laajentaminen. On olemassa kolme muuta valinnaista rajapintaa, jotka voidaan toteuttaa laajennetun toiminnallisuuden saavuttamiseksi:



  • Lataa metatiedot:

LoadMetadata sisältää menetelmiä metatietojen käsittelemiseksi. Suurimman osan kuormaajien suorituksista ei tarvitse toteuttaa tätä, elleivät ne ole vuorovaikutuksessa metatietojärjestelmän kanssa. Tämän käyttöliittymän getSchema () -menetelmä tarjoaa tavan latauslaitteiden toteutuksille kommunikoida tietojen skeemasta takaisin Pigille. Jos lataustoteutus palauttaa tietoja, jotka koostuvat todentyyppisistä kentistä, sen on annettava kaava, joka kuvaa getSchema () -menetelmän kautta palautettuja tietoja. Muut menetelmät käsittelevät muun tyyppisiä metatietoja, kuten osioavaimia ja tilastoja. Toteutukset voivat palauttaa näiden menetelmien nolla-paluuarvot, jos ne eivät ole kelvollisia muulle toteutukselle.

  • LoadPushDown:

LoadPushDownilla on erilaisia ​​tapoja siirtää toiminnot Pig-ajonaikaisesta kuormaajaan. Tällä hetkellä Pig kutsuu vain pushProjection () -menetelmää kommunikoimaan latauslaitteelle tarkat Pig-komentosarjassa vaaditut kentät. Lataimen toteutus voi halutessaan noudattaa tai olla noudattamatta pyyntöä. Jos lataimen toteutus päättää noudattaa pyyntöä, sen tulisi ottaa käyttöön LoadPushDown kyselyn suorituskyvyn parantamiseksi.

  • pushProjection ():

Tämä menetelmä ilmoittaa LoadFuncille, mitkä kentät vaaditaan Pig-komentosarjassa. Näin LoadFunc voi parantaa suorituskykyä lataamalla vain vaaditut kentät. pushProjection () vie ”requiredFieldList”. ”requiredFieldList” on vain luku -tilassa, eikä LoadFunc voi muuttaa sitä. ’RequiredFieldList’ sisältää luettelon ’requiredField’, jossa kukin ’requiredField’ osoittaa Pig-komentosarjan edellyttämän kentän ja koostuu indeksistä, aliaksesta, tyypistä ja alikentistä. Sika käyttää sarakehakemistoa requiredField.index kommunikoimaan LoadFuncin kanssa Pig-komentosarjan vaatimista kentistä. Jos pakollinen kenttä on kartta, Possu välittää ”requiredField.subFields”, joka sisältää luettelon avaimista, joita Pig-komentosarjat edellyttävät kartalle.



nosta luku voimaksi jaavassa
  • LoadCaster:

LoadCasterilla on tekniikoita tavu taulukoiden muuntamiseksi tietyntyyppisiksi. Lataustoteutuksen tulisi toteuttaa tämä, kun implisiittisiä tai eksplisiittisiä lähetyksiä DataByteArray-kentistä muihin tyypeihin on tuettava.

LoadFunc-abstrakti luokka on pääluokka, jota on laajennettava kuormaajan toteuttamiseen. Menetelmät, jotka vaaditaan ohittamaan, selitetään alla:

  • getInputFormat ():

    Pig kutsuu tätä menetelmää saadakseen kuormaajan käyttämän InputFormatin. Pig kutsuu InputFormat-menetelmiä samalla tavalla kuin Hadoop MapReduce Java -ohjelmassa. Jos InputFormat on Hadoop-pakattu, toteutuksen tulisi käyttää uutta API-pohjaista API org.apache.hadoop.mapreduce -kohdassa. Jos se on mukautettu InputFormat, se on parempi toteuttaa uudella sovellusliittymällä org.apache.hadoop.mapreduce.

  • setLocation ():

    Pig kutsuu tätä menetelmää viestimään kuorman sijainti kuormaajaan. Lataimen on käytettävä tätä tapaa välittää samat tiedot InputFormat-ytimelle. Sika kutsuu tätä menetelmää useita kertoja.

  • PreparToRead ():

    Tässä menetelmässä LoadFuncin tarjoamaan InputFormatiin liittyvä RecordReader välitetään LoadFuncille. GetNext () -sovelluksen toteutus voi nyt käyttää RecordReader-ohjelmaa palauttamaan tietueet edustavan dupleksin Pigiin.

  • getNext ():

    GetNext (): n merkitys ei ole muuttunut, ja Pig Runtime kutsuu sen hankkimaan seuraavan sekvenssin tiedoista. Tässä menetelmässä toteutuksen tulisi käyttää taustalla olevaa RecordReaderia ja rakentaa sekoitus palataksesi.

Oletustoteutukset LoadFuncissa:

Huomaa, että LoadFuncin oletustoteutukset tulisi ohittaa vain tarvittaessa.

  • setUdfContextSignature ():

    Sika kutsuu tätä menetelmää sekä etu- että takapäässä välittämään ainutlaatuisen allekirjoituksen Loaderille. Allekirjoitusta voidaan käyttää tallentamaan UDFContextiin kaikki tiedot, jotka Loaderin on tallennettava eri käyttöliittymien välillä käyttöliittymässä ja takana. Käyttötapaus on tallentaa sille lähetetty RequiredFieldList-tiedosto LoadPushDown.pushProjection (RequiredFieldList) -käyttöjärjestelmään, ennen kuin palautat joukot getNext () -kenttään. LoadFuncin oletustoteutuksessa on tyhjä runko. Tätä menetelmää kutsutaan ennen muita menetelmiä.

  • suhteellinenToAbsolutePath ():

    Sian ajonaika kutsuu tätä menetelmää sallimaan kuormaajan muuntaa suhteellinen kuormituspaikka absoluuttiseksi sijainniksi. LoadFuncin oletusarvoinen toteutus käsittelee tämän FileSystem-sijainneille. Jos latauslähde on jokin muu, laturin toteutus voi halutessaan ohittaa tämän.

Esimerkin lataustoteutus on tekstidatan latausohjelma, jonka rivin erotin on ‘
‘Ja’ ’oletuskentän erottimena, samanlainen kuin nykyinen PigStorage-latauslaite Pig-sovelluksessa. Toteutus käyttää olemassa olevaa Hadoop-tuettua Inputformatia - TextInputFormat - taustalla olevana InputFormatina.

public class SimpleTextLoader laajentaa LoadFunc {suojattu RecordReader in = null yksityisen tavun kenttäDel = '' private ArrayList mProtoTuple = null yksityinen TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader * (* Sika-lastaaja, joka käyttää määritettyä merkkiä kentän erottimena. * * @param erotin * yksitavuinen merkki, jota käytetään kenttien erottamiseen. * ('' on oletusarvo.) * / 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)) {tapaus 't': this.fieldDel = (tavu) '' taukotapa 'x' : fieldDel = Kokonaisluku.arvoOf (erotin.substring (2), 16) .byteValue () taukotapa 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () tauko oletus: heittää uusi RuntimeException ('Tuntematon erotin' + erotin)}} else {heitä uusi RuntimeException ('PigStorage-erottimen on oltava yksi merkki')}} @Override public Tuple getNext () heittää IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} Tekstiarvo = (Teksti) in.getCurrentValue () tavu [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iOnko sinulla kysymys meille? Mainitse se kommenttiosassa ja palaamme sinuun. 

Aiheeseen liittyvät julkaisut:

on git ja github sama