Apache Pig UDF: Part 3 - Funcions de la botiga



En aquest post es descriuen les funcions de la botiga Apache Pig UDF. (Apache Pig UDF: Part 3). Mireu les funcions de la botiga d’Apache Pig UDF.

La classe abstracta StoreFunc té els mètodes principals per emmagatzemar dades i, per a la majoria de casos d’ús, n’hi hauria prou amb ampliar-la. Hi ha una interfície opcional que es pot implementar per aconseguir una funcionalitat ampliada:





StoreMetadata

Aquesta interfície té mètodes per interactuar amb sistemes de metadades per emmagatzemar esquemes i estadístiques. Aquesta interfície és opcional i només s’ha d’implementar si cal emmagatzemar metadades.

def __init__ en python

A continuació s’expliquen els mètodes que cal anul·lar a StoreFunc:



  • getOutputFormat ():

    Aquest mètode serà anomenat per Pig per obtenir l'OutputFormat utilitzat per Storer. Els mètodes de l'OutputFormat seran anomenats per Pig de la mateixa manera i en el mateix context que per Hadoop en un programa Java reduït de mapes. Si l'OutputFormat és un paquet Hadoop, la implementació hauria d'utilitzar la nova API basada a org.apache.hadoop.mapreduce. Si es tracta d’un OutputFormat personalitzat, s’hauria d’implementar utilitzant la nova API a org.apache.hadoop.mapreduce. El porc cridarà el mètode checkOutputSpecs () de l'OutputFormat per comprovar la ubicació de sortida per davant. Aquest mètode també es cridarà com a part de la seqüència de trucades d'Hadoop quan s'iniciï el treball. Per tant, les implementacions haurien de garantir que aquest mètode es pugui anomenar diverses vegades sense efectes secundaris inconsistents.

  • setStoreLocation ():

    Pig diu aquest mètode per comunicar la ubicació de la botiga a l’emmagatzematge. L'emmagatzematge hauria d'utilitzar aquest mètode per comunicar la mateixa informació a l'OutputFormat subjacent. Aquest mètode és anomenat múltiples vegades per Pig. Les implementacions han de tenir en compte que aquest mètode s’anomena diverses vegades i ha de garantir que no hi hagi efectes secundaris inconsistents a causa de les trucades múltiples.

  • prepareToWrite ():

    A la nova API, l’escriptura de les dades es fa mitjançant l’OutputFormat proporcionat per StoreFunc. A prepareToWrite (), el RecordWriter associat amb l'OutputFormat proporcionat pel StoreFunc es passa al StoreFunc. El RecordWriter pot ser utilitzat per la implementació de putNext () per escriure una tupla que representi un registre de dades de la manera esperada per RecordWriter.

  • putNext ():

    El significat de putNext () no ha canviat i és anomenat pel temps d'execució de Pig per escriure la següent tupla de dades: a la nova API, aquest és el mètode en què la implementació utilitzarà el RecordWriter subjacent per escriure la tupla.

Implementacions predeterminades a StoreFunc:

  • setStoreFuncUDFContextSignature ():

    Pig anotarà aquest mètode tant a la part frontal com a la posterior per passar una signatura única al Storer. La signatura es pot utilitzar per emmagatzemar qualsevol informació a UDFContext que l’emmagatzemador hagi d’emmagatzemar entre diverses invocacions de mètodes a la part frontal i posterior. La implementació predeterminada a StoreFunc té un cos buit. Aquest mètode es dirà abans que qualsevol altre mètode.

  • relToAbsPathForStoreLocation ():

    El temps d’execució de Pig anomenarà aquest mètode per permetre a l’emmagatzemador convertir una ubicació relativa de la botiga a una ubicació absoluta. Es proporciona una implementació a StoreFunc que gestiona això per a ubicacions basades en FileSystem.

  • checkSchema ():

    Una funció de botiga hauria d'implementar aquesta funció per comprovar que un esquema determinat que descrigui les dades a escriure li sigui acceptable. La implementació predeterminada a StoreFunc té un cos buit. Aquest mètode es cridarà abans de qualsevol trucada a setStoreLocation ().

Exemple d'implementació:

La implementació de l’emmagatzematge de l’exemple és un emmagatzemador de dades de text amb delimitador de línia com a ‘
'I' 'com a delimitador de camp per defecte (que es pot anul·lar passant un delimitador de camp diferent al constructor): és similar al magatzemador PigStorage actual a Pig. La implementació utilitza un OutputFormat - TextOutputFormat compatible amb Hadoop existent com a OutputFormat subjacent.

public class SimpleTextStorer amplia StoreFunc {protected RecordWriter writer = null private byte fieldDel = 'private private final int BUFFER_SIZE = 1024 private static final String UTF8 = 'UTF-8' public PigStorage () {} public PigStorage (delimitador de cadenes) {this ( ) if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if (delimiter.length ()> 1delimiter.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 () per defecte: llança una RuntimeException nova (' Delimitador desconegut '+ delimitador)}} else {llença una RuntimeException nova (' el delimitador PigStorage ha de ser un caràcter únic ')}} ByteArrayOutputStream mOut = new ByteArrayOutputStream (BUFFER_SIZE) @Override public void putNext (Tuple f) llança IOException {int sz = f.size () per (int i = 0 i

Tens alguna pregunta? Esmenteu-los a la secció de comentaris i us respondrem.

Articles Relacionats:



Apache Pig UDF: 2a part
Apache Pig UDF: primera part

estableix java classpath a Linux