Apache Pig UDF: Part 2: funcions de càrrega



En aquest post es descriuen les funcions de càrrega d’Apache Pig UDF. (Apache Pig UDF: Part 2). Mireu les funcions de càrrega d'Apache Pig UDF.

La publicació d’avui tracta de les funcions de càrrega d’Apache Pig. Aquesta és la seqüela del primer missatge que cobria funcions UDF com Eval, Filter i Aggregate. Consulteu-los per obtenir més informació sobre altres funcions de Pig UDF.





La funció de càrrega del porc es basa en l’InputFormat d’un Hadoop, la classe que Hadoop utilitza per llegir les dades. InputFormat té dos propòsits: Determina com es fragmentarà l'entrada entre les tasques del mapa i proporciona un RecordReader que dóna lloc a parells valor-clau com a entrada a aquestes tasques de mapa. La classe base per a la funció de càrrega és LoadFunc.

Funció de càrrega: classificació:

La classe abstracta LoadFunc té tres mètodes principals per carregar dades i en la majoria dels casos d’ús n’hi hauria prou amb ampliar-les. Hi ha altres tres interfícies opcionals que es poden implementar per aconseguir una funcionalitat ampliada:



  • LoadMetadata:

LoadMetadata té mètodes per tractar les metadades. La majoria d’execucions de carregadors no necessiten implementar-ho tret que interactuen amb un sistema de metadades. El mètode getSchema () d'aquesta interfície ofereix una manera perquè les implementacions del carregador es comuniquin sobre l'esquema de les dades a Pig. Si una implementació del carregador retorna dades compostes per camps de tipus reals, hauria de proporcionar l’esquema que descriu les dades retornades mitjançant el mètode getSchema (). Els altres mètodes tracten altres tipus de metadades, com ara claus de partició i estadístiques. Les implementacions poden retornar valors de retorn nuls per a aquests mètodes si no són vàlids per a l’altra implementació.

  • LoadPushDown:

LoadPushDown té diferents mètodes per empènyer les operacions des del temps d’execució de Pig fins a les implementacions del carregador. Actualment, Pig només crida al mètode pushProjection () per comunicar al carregador, els camps exactes que són necessaris a l’escriptura Pig. La implementació del carregador pot optar per atendre o no la sol·licitud. Si la implementació del carregador decideix atendre la sol·licitud, hauria d'implementar LoadPushDown per millorar el rendiment de la consulta.

  • pushProjection ():

Aquest mètode informa LoadFunc, quins camps són obligatoris a l’escriptura Pig. D'aquesta manera, LoadFunc pot millorar el rendiment carregant només els camps necessaris. pushProjection () pren un ‘requiredFieldList.’ ‘requiredFieldList’ només es llegeix i no es pot canviar amb LoadFunc. 'RequiredFieldList' inclou una llista de 'requiredField', on cada 'requiredField' indica un camp requerit per l'script Pig i està format per índex, àlies, tipus i subcamps. Pig utilitza l’índex de columna requiredField.index per comunicar-se amb el LoadFunc sobre els camps requerits per l’escriptura Pig. Si el camp obligatori és un mapa, Pig passarà 'requiredField.subFields', que conté una llista de claus requerides pels scripts Pig per al mapa.



  • LoadCaster:

LoadCaster té tècniques per convertir matrius de bytes a tipus específics. Una implementació del carregador hauria d’implementar-ho quan s’hagi d’admetre els processos implícits o explícits de camps DataByteArray a altres tipus.

La classe abstracta LoadFunc és la classe principal que s’estén per implementar un carregador. A continuació s’expliquen els mètodes que cal anul·lar.

  • getInputFormat ():

    Pig utilitza aquest mètode per obtenir l’InputFormat que utilitza el carregador. Els mètodes de l’InputFormat són anomenats per Pig de la mateixa manera que Hadoop en un programa Java MapReduce. Si InputFormat és un paquet d’Hadoop, la implementació hauria d’utilitzar la nova API basada en org.apache.hadoop.mapreduce. Si és un InputFormat personalitzat, és millor implementar-lo mitjançant la nova API a org.apache.hadoop.mapreduce.

  • setLocation ():

    Aquest mètode és anomenat per Pig per comunicar la ubicació de la càrrega al carregador. El carregador ha d’utilitzar aquest mètode per comunicar la mateixa informació al nucli InputFormat. Aquest mètode és anomenat diverses vegades pel porc.

  • prepareToRead ():

    En aquest mètode, el RecordReader relacionat amb l'InputFormat proporcionat per LoadFunc es passa a LoadFunc. El RecordReader ara pot ser utilitzat per la implementació a getNext () per retornar una tuple que representa un registre de dades a Pig.

  • getNext ():

    El significat de getNext () no ha canviat i és anomenat pel temps d'execució de Pig per adquirir la següent tupla de les dades. En aquest mètode, la implementació hauria d’utilitzar el RecordReader subjacent i construir la tupla per tornar.

Implementacions per defecte a LoadFunc:

Tingueu en compte que les implementacions predeterminades de LoadFunc només s'han de substituir quan sigui necessari.

què és un java de memòria intermèdia
  • setUdfContextSignature ():

    Pig anomenarà aquest mètode, tant a la part frontal com a la part posterior, per passar una signatura única al carregador. La signatura es pot utilitzar per emmagatzemar qualsevol informació al UDFContext que el Loader necessiti emmagatzemar entre diverses invocacions de mètode a la part frontal i posterior. Un cas d’ús és emmagatzemar RequiredFieldList que se li ha passat a LoadPushDown.pushProjection (RequiredFieldList) per utilitzar-lo a la part posterior abans de retornar les tuples a getNext (). La implementació per defecte a LoadFunc té un cos buit. Aquest mètode es dirà abans que altres mètodes.

  • relativeToAbsolutePath ():

    El temps d’execució del porc cridarà aquest mètode per permetre al carregador convertir una ubicació de càrrega relativa a una ubicació absoluta. La implementació predeterminada proporcionada a LoadFunc gestiona això per a les ubicacions del sistema de fitxers. Si la font de càrrega és una altra cosa, la implementació del carregador pot optar per anul·lar-la.

La implementació del carregador de l’exemple és un carregador de dades de text amb delimitador de línia com a ‘
'I' 'com a delimitador de camp per defecte similar al carregador PigStorage actual a Pig. La implementació utilitza un Inputformat compatible amb Hadoop (TextInputFormat) com a InputFormat subjacent.

public class SimpleTextLoader estén LoadFunc {protectedReader Reader in = null privat byte fieldDel = 'private ArrayList mProtoTuple = nul privat TupleFactory mTupleFactory = TupleFactory.getInstance () privat static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {/}} Carregador de porcs que utilitza el caràcter especificat com a delimitador de camps. * * @param delimiter * el caràcter de byte únic que s'utilitza per separar els camps. * ('' és el valor per defecte.) * / public SimpleTextLoader (delimitador de cadenes) {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 () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: llançar nou RuntimeException ('Delimitador desconegut' + delimitador)}} else {llança RuntimeException nova ('El delimitador PigStorage ha de ser un sol caràcter')}} @Override Tuple public getNext () llança IOException {prova {boolean notDone = in.nextKeyValue () (notDone) {return null} Valor del text = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iTens alguna pregunta? Esmenta’l a la secció de comentaris i et respondrem. 

Articles Relacionats: