Apache Pig UDF: Del 2 - Lastfunksjoner



Dette innlegget beskriver Apache Pig UDF - Load Functions. (Apache Pig UDF: Del 2). Ta en titt på Load Functions of Apache Pig UDF.

Dagens innlegg handler om Load-funksjonene i Apache Pig. Dette er oppfølgeren til første innlegg som dekket UDF-funksjoner som Eval, Filter og Aggregate. Henvend deg til dem for mer informasjon om andre funksjoner i Pig UDF.





hvordan lage loggerfil i java

Grisens lastfunksjon er bygget på toppen av Hadops InputFormat, klassen Hadoop bruker til å lese data. InputFormat har to formål: Den bestemmer hvordan input vil bli fragmentert mellom kartoppgaver og gir en RecordReader som resulterer i nøkkelverdipar som input til disse kartoppgavene. Grunnklassen for lastfunksjonen er LoadFunc.

Lastfunksjon - Klassifisering:

LoadFunc abstrakt klasse har tre hovedmetoder for å laste inn data, og i de fleste brukstilfeller vil det være tilstrekkelig å utvide det. Det er tre andre valgfrie grensesnitt som kan implementeres for å oppnå utvidet funksjonalitet:



  • LoadMetadata:

LoadMetadata har metoder for å håndtere metadata. Mest utførelse av lastere trenger ikke å implementere dette med mindre de samhandler med et metadatasystem. GetSchema () -metoden i dette grensesnittet gir en måte for lasterimplementeringene å kommunisere om skjemaet til dataene tilbake til Pig. Hvis en lasterimplementering returnerer data som består av felt av virkelige typer, bør den gi skjemaet som beskriver dataene som returneres gjennom getSchema () -metoden. De andre metodene håndterer andre typer metadata som partisjonsnøkler og statistikk. Implementeringer kan returnere nullverdier for disse metodene hvis de ikke er gyldige for den andre implementeringen.

  • LoadPushDown:

LoadPushDown har forskjellige metoder for å skyve operasjoner fra grisens kjøretid til lasterimplementeringer. For øyeblikket er det bare pushProjection () -metoden som kalles av Pig for å kommunisere til lasteren, de nøyaktige feltene som kreves i Pig-skriptet. Lasterimplementeringen kan velge å etterkomme forespørselen eller ikke. Hvis lasterimplementeringen bestemmer seg for å etterkomme forespørselen, bør den implementere LoadPushDown for å forbedre spørringsytelsen.

  • pushProjection ():

Denne metoden informerer LoadFunc, hvilke felt som kreves i griseskriptet. Dermed kan LoadFunc forbedre ytelsen ved å bare laste inn de nødvendige feltene. pushProjection () tar en ‘requiredFieldList.’ ‘requiredFieldList’ er skrivebeskyttet og kan ikke endres av LoadFunc. 'RequiredFieldList' inneholder en liste over 'requiredField', der hvert 'requiredField' indikerer et felt som kreves av Pig-skriptet og består av indeks, alias, type og underfelt. Gris bruker kolonneindeksen requiredField.index for å kommunisere med LoadFunc om feltene som kreves av griseskriptet. Hvis det obligatoriske feltet er et kart, vil Pig passere ‘requiredField.subFields’ som inneholder en liste over nøkler som kreves av Pig-skript for kartet.



hvordan å dype kopiere i java
  • LoadCaster:

LoadCaster har teknikker for å konvertere byte-arrays til bestemte typer. En lasterimplementering bør implementere dette når implisitte eller eksplisitte kast fra DataByteArray-felt til andre typer må støttes.

LoadFunc-abstraktklassen er hovedklassen som skal utvides for implementering av en laster. Metodene som må overstyres er forklart nedenfor:

  • getInputFormat ():

    Denne metoden kalles av Pig for å få InputFormat brukt av lasteren. Metodene i InputFormat kalles av Pig på samme måte som Hadoop i et MapReduce Java-program. Hvis InputFormat er en Hadoop-pakket, bør implementeringen bruke den nye API-baserte, under org.apache.hadoop.mapreduce. Hvis det er en tilpasset InputFormat, er det bedre å implementeres ved hjelp av den nye API-en i org.apache.hadoop.mapreduce.

  • setLocation ():

    Denne metoden kalles Pig for å kommunisere lasteplasseringen til lasteren. Lasteren må bruke denne metoden for å kommunisere den samme informasjonen til kjernen InputFormat. Denne metoden kalles flere ganger av gris.

  • prepareToRead ():

    I denne metoden blir RecordReader relatert til InputFormat levert av LoadFunc sendt til LoadFunc. RecordReader kan nå brukes av implementeringen i getNext () for å returnere en tuple som representerer en dataregistrering tilbake til gris.

  • getNext ():

    Betydningen av getNext () har ikke endret seg og kalles av grisens kjøretid for å skaffe seg neste tuple i dataene. I denne metoden bør implementeringen bruke den underliggende RecordReader og konstruere tupelen for å returnere.

Standardimplementeringer i LoadFunc:

Vær oppmerksom på at standardimplementeringene i LoadFunc bare skal overstyres når det er nødvendig.

  • setUdfContextSignature ():

    Denne metoden vil bli kalt av Pig, både i frontenden og bakenden for å gi en unik signatur til Loader. Signaturen kan brukes til å lagre all informasjon i UDFContext som Loader trenger å lagre mellom forskjellige metodeinnkallinger i frontenden og bakenden. En brukssak er å lagre RequiredFieldList sendt til den i LoadPushDown.pushProjection (RequiredFieldList) for bruk i bakenden før du returnerer tuples i getNext (). Standardimplementeringen i LoadFunc har en tom kropp. Denne metoden vil bli kalt før andre metoder.

  • relativeToAbsolutePath ():

    Svinekjøring vil kalle denne metoden for å tillate lasteren å konvertere en relativ lasteplassering til en absolutt plassering. Standardimplementeringen i LoadFunc håndterer dette for FileSystem-steder. Hvis lastekilden er noe annet, kan lasterimplementering velge å overstyre dette.

Lasterimplementeringen i eksemplet er en laster for tekstdata med linjeavgrenser som ‘
‘Og‘ ‘som standard feltavgrenser som ligner på gjeldende PigStorage-laster i Pig. Implementeringen bruker en eksisterende Hadoop-støttet Inputformat - TextInputFormat - som den underliggende InputFormat.

konverter streng til dato i java
offentlig klasse SimpleTextLoader utvider LoadFunc {beskyttet RecordReader i = null privat byte fieldDel = '' privat ArrayList mProtoTuple = null privat TupleFactory mTupleFactory = TupleFactory.getInstance () privat statisk slutt int BUFFER_SIZE = 1024 offentlig SimpleTextLoader **) Griselaster som bruker spesifisert tegn som feltavgrenser. * * @param avgrenser * enkeltbytetegnet som brukes til å skille felt. * ('' er standard.) * / offentlig SimpleTextLoader (strengavgrensning) {dette () hvis (skilletegn.lengde () == 1) {dette.fieldDel = (byte) skilletegn.charAt (0)} annet 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 nytt RuntimeException ('Ukjent skilletegn' + skilletegn)}} annet {kast ny RuntimeException ('PigStorage-skilletegn må være ett tegn')}} @ Override public Tuple getNext () kaster IOException {prøv {boolean notDone = in.nextKeyValue () hvis (notDone) {return null} Tekstverdi = (Tekst) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iHar du et spørsmål til oss? Vennligst nevn det i kommentarfeltet, så kommer vi tilbake til deg. 

Relaterte innlegg: