Apache Pig UDF: Deel 2 - Laadfuncties



Dit bericht beschrijft Apache Pig UDF - Laadfuncties. (Apache Pig UDF: deel 2). Bekijk de laadfuncties van Apache Pig UDF.

Het bericht van vandaag gaat over de laadfuncties in Apache Pig. Dit is het vervolg op de eerste post die UDF-functies omvatte zoals Eval, Filter en Aggregate. Raadpleeg ze voor meer informatie over andere functies van Pig UDF.





De laadfunctie van Pig is gebouwd bovenop een Hadoop's InputFormat, de klasse die Hadoop gebruikt om gegevens te lezen. InputFormat heeft twee doelen: het bepaalt hoe de invoer wordt gefragmenteerd tussen kaarttaken en biedt een RecordReader die resulteert in sleutel-waardeparen als invoer voor die kaarttaken. De basisklasse voor de laadfunctie is LoadFunc.

Laadfunctie - classificatie:

De abstracte klasse LoadFunc heeft drie hoofdmethoden voor het laden van gegevens en in de meeste gevallen zou het voldoende zijn om deze uit te breiden. Er zijn drie andere optionele interfaces die kunnen worden geïmplementeerd om uitgebreide functionaliteit te bereiken:



  • Laadmetagegevens:

LoadMetadata heeft methoden om met metadata om te gaan. De meeste uitvoerders van laders hoeven dit niet te implementeren, tenzij ze communiceren met een metadatasysteem. De methode getSchema () in deze interface biedt een manier voor de laderimplementaties om over het schema van de gegevens terug naar Pig te communiceren. Als een laderimplementatie gegevens retourneert die bestaan ​​uit velden van echte typen, moet deze het schema leveren dat de gegevens beschrijft die worden geretourneerd via de methode getSchema (). De andere methoden hebben betrekking op andere soorten metagegevens, zoals partitiesleutels en statistieken. Implementaties kunnen voor deze methoden null-retourwaarden retourneren als ze niet geldig zijn voor de andere implementatie.

  • LoadPushDown:

LoadPushDown heeft verschillende methoden om bewerkingen van Pig-runtime naar laderimplementaties te pushen. Momenteel wordt alleen de methode pushProjection () door Pig aangeroepen om met de loader de exacte velden te communiceren die vereist zijn in het Pig-script. De laderimplementatie kan ervoor kiezen om aan het verzoek te voldoen of niet. Als de laderimplementatie besluit om aan het verzoek te voldoen, moet het LoadPushDown implementeren om de queryprestaties te verbeteren.

hoe database testen te doen
  • pushProjection ():

Deze methode informeert LoadFunc, welke velden vereist zijn in het Pig-script. Hierdoor kan LoadFunc de prestaties verbeteren door alleen de velden te laden die vereist zijn. pushProjection () neemt een ‘requiredFieldList’ ‘requiredFieldList’ is alleen-lezen en kan niet worden gewijzigd door LoadFunc. ‘RequiredFieldList’ bevat een lijst met ‘requiredField’, waarbij elk ‘requiredField’ een veld aangeeft dat vereist is door het Pig-script en bestaat uit index, alias, type en subFields. Pig gebruikt de kolomindex requiredField.index om met de LoadFunc te communiceren over de velden die vereist zijn voor het Pig-script. Als het vereiste veld een kaart is, zal Pig ‘requiredField.subFields’ doorgeven, dat een lijst met sleutels bevat die nodig zijn voor Pig-scripts voor de kaart.



  • LoadCaster:

LoadCaster heeft technieken om byte-arrays om te zetten in specifieke typen. Een laderimplementatie zou dit moeten implementeren als impliciete of expliciete casts van DataByteArray-velden naar andere typen moeten worden ondersteund.

De abstracte klasse LoadFunc is de belangrijkste klasse die moet worden uitgebreid voor het implementeren van een lader. De methoden die moeten worden overschreven, worden hieronder uitgelegd:

  • getInputFormat ():

    Deze methode wordt aangeroepen door Pig om het InputFormat te gebruiken voor de loader. De methoden in het InputFormat worden door Pig op dezelfde manier aangeroepen als Hadoop in een MapReduce Java-programma. Als het InputFormat een Hadoop-pakket is, moet de implementatie de nieuwe API-gebaseerde gebruiken, onder org.apache.hadoop.mapreduce. Als het een aangepast InputFormat is, is het beter om te worden geïmplementeerd met de nieuwe API in org.apache.hadoop.mapreduce.

  • setLocation ():

    Deze methode wordt door Pig aangeroepen om de laadlocatie aan de lader door te geven. De lader moet deze methode gebruiken om dezelfde informatie door te geven aan de kern van InputFormat. Deze methode wordt meerdere keren aangeroepen door varken.

  • preparToRead ():

    Bij deze methode wordt de RecordReader gerelateerd aan het InputFormat geleverd door de LoadFunc doorgegeven aan de LoadFunc. De RecordReader kan nu worden gebruikt door de implementatie in getNext () om een ​​tuple die een record met gegevens weergeeft, terug te sturen naar Pig.

  • getNext ():

    De betekenis van getNext () is niet veranderd en wordt aangeroepen door Pig-runtime om het volgende tupel in de gegevens op te halen. Bij deze methode moet de implementatie de onderliggende RecordReader gebruiken en het tuple construeren dat moet worden geretourneerd.

Standaardimplementaties in LoadFunc:

Houd er rekening mee dat de standaardimplementaties in LoadFunc alleen moeten worden overschreven als dat nodig is.

wat is pojo in het voorjaar
  • setUdfContextSignature ():

    Deze methode wordt door Pig aangeroepen, zowel aan de voorkant als aan de achterkant om een ​​unieke handtekening door te geven aan de Loader. De handtekening kan worden gebruikt om alle informatie in de UDFC-context op te slaan die de Loader moet opslaan tussen verschillende methode-aanroepen in de front-end en back-end. Een use case is het opslaan van RequiredFieldList die eraan is doorgegeven in LoadPushDown.pushProjection (RequiredFieldList) voor gebruik in de back-end voordat tuples worden geretourneerd in getNext (). De standaardimplementatie in LoadFunc heeft een lege body. Deze methode wordt eerder aangeroepen dan andere methoden.

  • relatieveToAbsolutePath ():

    Pig runtime roept deze methode aan om de lader toe te staan ​​een relatieve laadlocatie naar een absolute locatie te converteren. De standaardimplementatie in LoadFunc verwerkt dit voor FileSystem-locaties. Als de laadbron iets anders is, kan de laderimplementatie ervoor kiezen om dit te negeren.

De laderimplementatie in het voorbeeld is een lader voor tekstgegevens met een lijnscheidingsteken als ‘
‘En‘ als standaard veldscheidingsteken, vergelijkbaar met de huidige PigStorage-lader in Pig. De implementatie gebruikt een bestaand door Hadoop ondersteund Inputformat - TextInputFormat - als het onderliggende InputFormat.

public class SimpleTextLoader breidt LoadFunc {protected RecordReader uit in = null private byte fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 openbare SimpleTextLoader () {} / ** * Constructies Varkenslader die een opgegeven teken gebruikt als veldscheidingsteken. * * @param scheidingsteken * het teken van één byte dat wordt gebruikt om velden te scheiden. * ('' is de standaard.) * / 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)) {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: throw new RuntimeException ('Unknown delimiter' + delimiter)}} else {throw new RuntimeException ('PigStorage delimeter must be a single character')}} @Override public Tuple getNext () gooit IOException {try {boolean notDone = in.nextKeyValue () als (notDone) {return null} Tekstwaarde = (Tekst) in.getCurrentValue () byte [] buf = waarde.getBytes () int len ​​= waarde.getLength () int start = 0 voor (int i = 0 iHeeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte en we nemen contact met u op. 

Gerelateerde berichten: