Apache Pig UDF: Del 2 - Indlæsningsfunktioner



Dette indlæg beskriver om Apache Pig UDF - Load Functions. (Apache Pig UDF: Del 2). Se på indlæsningsfunktionerne i Apache Pig UDF.

Dagens indlæg handler om Load-funktionerne i Apache Pig. Dette er efterfølgeren til første indlæg der dækkede UDF-funktioner som Eval, Filter og Aggregate. Henvend dig til dem for mere information om andre funktioner i Pig UDF.





måder at oprette singleton-klasse i java på

Grisens belastningsfunktion er bygget oven på en Hadoop's InputFormat, den klasse, som Hadoop bruger til at læse data. InputFormat har to formål: Den bestemmer, hvordan input skal fragmenteres mellem kortopgaver og giver en RecordReader, der resulterer i nøgleværdipar som input til disse kortopgaver. Basisklassen for belastningsfunktionen er LoadFunc.

Belastningsfunktion - Klassificering:

LoadFunc abstrakt klasse har tre hovedmetoder til at indlæse data, og i de fleste brugstilfælde er det tilstrækkeligt at udvide dem. Der er tre andre valgfrie grænseflader, der kan implementeres for at opnå udvidet funktionalitet:



  • LoadMetadata:

LoadMetadata har metoder til at håndtere metadata. Mest udførelse af loaders behøver ikke at implementere dette, medmindre de interagerer med et metadatasystem. Metoden getSchema () i denne grænseflade giver en måde, hvorpå loaderimplementeringerne kan kommunikere om skemaet for dataene tilbage til Pig. Hvis en loaderimplementering returnerer data bestående af felter af reelle typer, skal den give skemaet, der beskriver de data, der returneres via getSchema () -metoden. De andre metoder beskæftiger sig med andre typer metadata som partitionsnøgler og statistik. Implementeringer kan returnere null-returværdier for disse metoder, hvis de ikke er gyldige til den anden implementering.

  • LoadPushDown:

LoadPushDown har forskellige metoder til at skubbe operationer fra svinekørsel til loaderimplementeringer. I øjeblikket kaldes kun pushProjection () -metoden af ​​Pig til at kommunikere til læsseren, de nøjagtige felter, der kræves i Pig-scriptet. Læsserimplementeringen kan vælge at imødekomme eller ikke imødekomme anmodningen. Hvis loaderimplementeringen beslutter at efterkomme anmodningen, skal den implementere LoadPushDown for at forbedre forespørgselsydelsen.

  • pushProjection ():

Denne metode informerer LoadFunc, hvilke felter der kræves i Pig-scriptet. Dermed gør det muligt for LoadFunc at forbedre ydeevnen ved kun at indlæse de krævede felter. pushProjection () tager en 'requiredFieldList'. 'requiredFieldList' er skrivebeskyttet og kan ikke ændres af LoadFunc. 'RequiredFieldList' inkluderer en liste med 'requiredField', hvor hvert 'requiredField' angiver et felt, der kræves af Pig-scriptet, og består af indeks, alias, type og underfelter. Gris bruger kolonneindekset requiredField.index til at kommunikere med LoadFunc om de felter, der kræves af Pig-scriptet. Hvis det krævede felt er et kort, sender Pig 'requiredField.subFields', som indeholder en liste over nøgler, der kræves af Pig-scripts til kortet.



  • LoadCaster:

LoadCaster har teknikker til at konvertere byte-arrays til bestemte typer. En loaderimplementering skal implementere dette, når implicit eller eksplicit casting fra DataByteArray-felter til andre typer skal understøttes.

LoadFunc-abstraktklassen er hovedklassen, der skal udvides til implementering af en læsser. De metoder, der skal tilsidesættes, forklares nedenfor:

  • getInputFormat ():

    Denne metode kaldes Pig for at få InputFormat brugt af læsseren. Metoderne i InputFormat kaldes af Pig på samme måde som Hadoop i et MapReduce Java-program. Hvis InputFormat er en Hadoop-pakket, skal implementeringen bruge den nye API-baserede under org.apache.hadoop.mapreduce. Hvis det er en brugerdefineret InputFormat, er det bedre at blive implementeret ved hjælp af den nye API i org.apache.hadoop.mapreduce.

  • setLocation ():

    Denne metode kaldes af Pig for at kommunikere lastplaceringen til læsseren. Læsseren skal bruge denne metode til at kommunikere de samme oplysninger til kernen InputFormat. Denne metode kaldes svin flere gange.

  • prepareToRead ():

    I denne metode sendes RecordReader relateret til InputFormat leveret af LoadFunc til LoadFunc. RecordReader kan nu bruges af implementeringen i getNext () til at returnere en tuple, der repræsenterer en dataregistrering tilbage til Gris.

  • getNext ():

    Betydningen af ​​getNext () er ikke ændret og kaldes af svinekørsel for at tilegne sig den næste tuple i dataene. I denne metode skal implementeringen bruge den underliggende RecordReader og konstruere tuplen til at vende tilbage.

Standardimplementeringer i LoadFunc:

Vær opmærksom på, at standardimplementeringerne i LoadFunc kun bør tilsidesættes, når det er nødvendigt.

hvad er pojo om foråret
  • setUdfContextSignature ():

    Denne metode kaldes af svin, både i frontenden og bagenden for at give en unik signatur til læsseren. Signaturen kan bruges til at gemme enhver information i UDFContext, som Loader har brug for at gemme mellem forskellige metodeopkald i frontenden og bagenden. En brugssag er at gemme RequiredFieldList, der sendes til den i LoadPushDown.pushProjection (RequiredFieldList) til brug i den bageste ende, før du returnerer tuples i getNext (). Standardimplementeringen i LoadFunc har en tom krop. Denne metode kaldes før andre metoder.

  • relativeToAbsolutePath ():

    Svinekørsel kalder denne metode for at tillade Loader at konvertere en relativ belastningsplacering til en absolut placering. Standardimplementeringen i LoadFunc håndterer dette for FileSystem-placeringer. Hvis belastningskilden er noget andet, kan lasterimplementering muligvis vælge at tilsidesætte dette.

Loaderimplementeringen i eksemplet er en loader til tekstdata med linjeafgrænsning som '
'Og' 'som standardfeltafgrænser svarende til den aktuelle PigStorage-læser i Pig. Implementeringen bruger et eksisterende Hadoop-understøttet Inputformat - TextInputFormat - som det underliggende InputFormat.

offentlig klasse SimpleTextLoader udvider LoadFunc {beskyttet RecordReader i = null privat byte fieldDel = '' privat ArrayList mProtoTuple = null privat TupleFactory mTupleFactory = TupleFactory.getInstance () privat statisk endelig int BUFFER_SIZE = 1024 offentlig SimpleTextLoader **) Pig loader, der bruger specificeret tegn som markafgrænser. * * @param afgrænser * det enkelte byte-tegn, der bruges til at adskille felter. * ('' er standard.) * / public SimpleTextLoader (Stringafgrænser) {dette () hvis (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} andet hvis ( 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 default: kast nyt RuntimeException ('Ukendt afgrænser' + afgrænser)}} andet {kast ny RuntimeException ('PigStorage-afgrænser skal være et enkelt tegn')}} @ Override public Tuple getNext () kaster IOException {prøv {boolean notDone = in.nextKeyValue () hvis (notDone) {return null} Tekstværdi = (Tekst) in.getCurrentValue () byte [] buf = værdi.getBytes () int len ​​= værdi.getLængde () int start = 0 for (int i = 0 iHar du et spørgsmål til os? Nævn det i kommentarfeltet, og vi vender tilbage til dig. 

Relaterede indlæg: