Apache Pig UDF: Del 2 - Lastfunktioner



Detta inlägg beskriver om Apache Pig UDF - Load Functions. (Apache Pig UDF: Del 2). Ta en titt på Load Functions of Apache Pig UDF.

Dagens inlägg handlar om Load-funktionerna i Apache Pig. Detta är uppföljaren till första inlägg som täckte UDF-funktioner som Eval, Filter och Aggregate. Vänligen hänvisa till dem för mer information om andra funktioner i Pig UDF.





vad är big data och hadoop

Pigs lastfunktion är byggd ovanpå en Hadoop's InputFormat, den klass som Hadoop använder för att läsa data. InputFormat har två syften: Den bestämmer hur ingången kommer att fragmenteras mellan kartuppgifter och ger en RecordReader som resulterar i nyckel-värdepar som inmatning till dessa kartuppgifter. Basklassen för lastfunktionen är LoadFunc.

Lastfunktion - Klassificering:

LoadFunc-abstraktklassen har tre huvudmetoder för att ladda data och i de flesta användningsfall räcker det att utöka det. Det finns tre andra valfria gränssnitt som kan implementeras för att uppnå utökad funktionalitet:



  • LoadMetadata:

LoadMetadata har metoder för att hantera metadata. De flesta körningar av lastare behöver inte implementera detta om de inte interagerar med ett metadatasystem. GetSchema () -metoden i det här gränssnittet erbjuder ett sätt för lastarimplementeringarna att kommunicera om schemat för datan tillbaka till Pig. Om en lastarimplementering returnerar data som består av fält av riktiga typer, bör det tillhandahålla schemat som beskriver data som returneras genom getSchema () -metoden. De andra metoderna hanterar andra typer av metadata som partitionsnycklar och statistik. Implementationer kan returnera null-returvärden för dessa metoder om de inte är giltiga för den andra implementeringen.

  • LoadPushDown:

LoadPushDown har olika metoder för att driva operationer från grisens körtid till lastarimplementeringar. För närvarande kallas endast pushProjection () -metoden av Pig för att kommunicera till lastaren, de exakta fälten som krävs i Pig-skriptet. Lastarimplementeringen kan välja att efterkomma eller inte följa begäran. Om lastarimplementeringen beslutar att följa begäran, bör den implementera LoadPushDown för att förbättra frågan.

  • pushProjection ():

Den här metoden informerar LoadFunc, vilka fält som krävs i grisskriptet. Således möjliggör LoadFunc att förbättra prestanda genom att endast ladda de fält som krävs. pushProjection () tar en ”requiredFieldList.” ”requiredFieldList” är skrivskyddad och kan inte ändras av LoadFunc. 'RequiredFieldList' innehåller en lista med 'requiredField', där varje 'requiredField' indikerar ett fält som krävs av Pig-skriptet och består av index, alias, typ och underfält. Gris använder kolumnindex requiredField.index för att kommunicera med LoadFunc om de fält som krävs av Pig-skriptet. Om det obligatoriska fältet är en karta kommer Pig att skicka 'requiredField.subFields' som innehåller en lista med nycklar som krävs av Pig-skript för kartan.



  • LoadCaster:

LoadCaster har tekniker för att konvertera byte-arrays till specifika typer. En laddarimplementering bör implementera detta när implicita eller explicita cast från DataByteArray-fält till andra typer behöver stödjas.

LoadFunc-abstraktklassen är huvudklassen som ska utvidgas för implementering av en lastare. De metoder som krävs för att åsidosättas förklaras nedan:

  • getInputFormat ():

    Denna metod kallas av Pig för att få InputFormat att användas av lastaren. Metoderna i InputFormat anropas av Pig på samma sätt som Hadoop i ett MapReduce Java-program. Om InputFormat är en Hadoop-förpackad, bör implementeringen använda den nya API-baserade, under org.apache.hadoop.mapreduce. Om det är en anpassad InputFormat är det bättre att implementeras med det nya API: et i org.apache.hadoop.mapreduce.

  • setLocation ():

    Denna metod kallas av Pig för att kommunicera lastplatsen till lastaren. Lastaren måste använda denna metod för att kommunicera samma information till kärnan InputFormat. Denna metod kallas flera gånger av gris.

  • prepareToRead ():

    I den här metoden skickas RecordReader relaterad till InputFormat från LoadFunc till LoadFunc. RecordReader kan nu användas av implementeringen i getNext () för att returnera en tupel som representerar en datapost till Pig.

  • getNext ():

    Betydelsen av getNext () har inte ändrats och kallas av Pig runtime för att skaffa nästa tuple i data. I den här metoden ska implementeringen använda den underliggande RecordReader och konstruera tupeln för att återvända.

Standardimplementeringar i LoadFunc:

Observera att standardimplementeringarna i LoadFunc endast bör åsidosättas vid behov.

  • setUdfContextSignature ():

    Denna metod kommer att kallas av Pig, både i fronten och baksidan för att skicka en unik signatur till Loader. Signaturen kan användas för att lagra all information i UDFContext som Loader behöver lagra mellan olika metodinfordringar i frontend och backend. Ett användningsfall är att lagra RequiredFieldList som skickas till den i LoadPushDown.pushProjection (RequiredFieldList) för användning i bakänden innan du returnerar tuples i getNext (). Standardimplementeringen i LoadFunc har en tom kropp. Denna metod kommer att anropas före andra metoder.

  • relativeToAbsolutePath ():

    Pig runtime kommer att anropa den här metoden för att tillåta Loader att konvertera en relativ lastplats till en absolut plats. Standardimplementeringen i LoadFunc hanterar detta för FileSystem-platser. Om lastkällan är något annat kan lasterimplementering välja att åsidosätta detta.

Lastarimplementeringen i exemplet är en lastare för textdata med linjeavgränsare som ”
'Och' 'som standardfältavgränsare som liknar den nuvarande PigStorage-laddaren i Pig. Implementeringen använder en befintlig Inputformat som stöds av Hadoop - TextInputFormat - som den underliggande InputFormat.

offentlig klass SimpleTextLoader förlänger LoadFunc {skyddad RecordReader i = null privat byte fieldDel = '' privat ArrayList mProtoTuple = null privat TupleFactory mTupleFactory = TupleFactory.getInstance () privat statisk slutlig int BUFFER_SIZE = 1024 offentlig SimpleTextLoader **) Grislastare som använder specificerat tecken som fältavgränsare. * * @param avgränsare * det enda byte-tecken som används för att separera fält. * ('' är standard.) * / public SimpleTextLoader (Strängavgränsare) {detta () om (avgränsare.längd () == 1) {this.fieldDel = (byte) avgränsare.charAt (0)} annat om ( avgränsare.längd ()> 1 & & avgränsare.charAt (0) == '') {switch (avgränsare.charAt (1)) {fall 't': this.fieldDel = (byte) '' brytfall 'x' : fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: kasta nytt RuntimeException ('Okänd avgränsare' + avgränsare)}} annat {kasta ny RuntimeException ('PigStorage-avgränsare måste vara enstaka tecken')}} @ Override public Tuple getNext () kastar IOException {try {boolean notDone = in.nextKeyValue () om (notDone) {return null} Textvärde = (Text) i.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 för (int i = 0 iHar du en fråga till oss? Vänligen nämna det i kommentarfältet så återkommer vi till dig. 

Relaterade inlägg: