Apache Pig UDF: 2 dalis - apkrovos funkcijos



Šiame įraše aprašoma apie „Apache Pig UDF“ - apkrovos funkcijas. (Apache Pig UDF: 2 dalis). Pažvelkite į „Apache Pig UDF“ apkrovos funkcijas.

Šiandienos įrašas yra apie „Apache Pig“ įkėlimo funkcijas. Tai yra pirmasis pranešimas kuris apėmė UDF funkcijas, tokias kaip „Eval“, „Filter“ ir „Aggregate“. Prašome kreiptis į juos, jei norite gauti daugiau informacijos apie kitas „Pig UDF“ funkcijas.





Kiaulės apkrovos funkcija sukurta ant „Hadoop“ „InputFormat“, klasės, kurią Hadoopas naudoja duomenims skaityti. „InputFormat“ turi du tikslus: jis nustato, kaip įvestis bus suskaidyta tarp žemėlapio užduočių, ir pateikia „RecordReader“, dėl kurio raktų reikšmių poros yra įvestis toms žemėlapio užduotims. Pagrindinė apkrovos funkcijos klasė yra „LoadFunc“.

Apkrovos funkcija - klasifikacija:

„LoadFunc“ abstrakčioje klasėje yra trys pagrindiniai duomenų įkėlimo metodai, ir daugeliu atvejų jų pakaktų išplėsti. Yra trys kitos pasirinktinės sąsajos, kurias galima įdiegti norint išplėsti funkcionalumą:



  • „LoadMetadata“:

„LoadMetadata“ turi metodų, kaip tvarkyti metaduomenis. Daugumai krautuvų nereikia to įgyvendinti, nebent jie sąveikauja su metaduomenų sistema. Šios sąsajos „getSchema“ () metodas suteikia galimybę krautuvo diegimams pranešti apie duomenų schemą „Pig“. Jei krautuvo diegimas pateikia duomenis, susidedančius iš tikrųjų tipų laukų, jis turėtų pateikti schemą, apibūdinančią duomenis, grąžintus naudojant metodą getSchema (). Kiti metodai nagrinėja kitų tipų metaduomenis, pvz., Skaidinių raktus ir statistiką. Įdiegimai gali grąžinti nulines šių metodų grąžinimo vertes, jei jos negalioja kitam diegimui.

  • „LoadPushDown“:

„LoadPushDown“ turi skirtingus metodus, kaip perkelti operacijas iš „Pig“ vykdymo laiko į krautuvo diegimą. Šiuo metu „Pig“ iškviečia tik metodą „pushProjection ()“, kad galėtų pranešti apie krautuvą - tikslius „Pig“ scenarijaus laukus. Krautuvo diegimas gali pasirinkti laikytis užklausos. Jei krautuvo diegimas nusprendžia laikytis užklausos, jis turėtų įdiegti „LoadPushDown“, kad pagerintų užklausos našumą.

  • „pushProjection“):

Šis metodas informuoja „LoadFunc“, kurie laukai yra būtini „Pig“ scenarijuje. Tokiu būdu „LoadFunc“ gali pagerinti našumą įkeliant tik tuos laukus, kurių reikia. „pushProjection ()“ užima „requiredFieldList“. „requiredFieldList“ yra tik skaitomas ir „LoadFunc“ negali jo pakeisti. „RequiredFieldList“ apima „requiredField“ sąrašą, kur kiekvienas „requiredField“ nurodo lauką, kurio reikalauja „Pig“ scenarijus, ir kurį sudaro indeksas, pseudonimas, tipas ir antriniai laukai. Kiauliena naudoja stulpelių indeksą requiredField.index, kad bendrautų su „LoadFunc“ apie laukus, kurių reikalauja „Pig“ scenarijus. Jei privalomas laukas yra žemėlapis, Kiaulė perduos „requiredField.subFields“, kuriame yra raktų sąrašas, reikalingas „Pig“ scenarijams žemėlapiui.



  • „LoadCaster“:

„LoadCaster“ turi būdų, kaip konvertuoti baitų masyvus į konkrečius tipus. Krautuvo diegimas turėtų tai įgyvendinti, kai reikia palaikyti numanomą ar aiškų perdavimą iš „DataByteArray“ laukų į kitus tipus.

„LoadFunc“ abstrakčioji klasė yra pagrindinė klasė, kurią reikia išplėsti įgyvendinant krautuvą. Metodai, kurių reikia nepaisyti, paaiškinti toliau:

  • „getInputFormat“ ():

    Šį metodą kiaulė iškvietė, kad gautų krautuvo naudojamą „InputFormat“. „InputFormat“ metodus kiaulė vadina taip pat, kaip „Hadoop“ „MapReduce Java“ programoje. Jei „InputFormat“ yra „Hadoop“ paketas, diegimas turėtų naudoti naują API pagrįstą, esančią org.apache.hadoop.mapreduce. Jei tai yra pasirinktinis „InputFormat“, geriau jį įdiegti naudojant naują API, esantį org.apache.hadoop.mapreduce.

  • setLocation ():

    Šį metodą kiaulė iškvietė perkelti krautuvui apkrovos vietą. Krautuvas turi naudoti šį metodą, kad tą pačią informaciją perduotų pagrindinei „InputFormat“. Kiaulė šį metodą vadina kelis kartus.

  • „pasiruošti“ ():

    Taikant šį metodą, „RecordReader“, susijęs su „LoadFunc“ pateikta „InputFormat“, yra perduodamas „LoadFunc“. „RecordReader“ dabar gali naudoti diegimas „getNext“ (), kad grąžintų „Pig“ duomenų įrašą.

  • getNext ():

    „GetNext“ () reikšmė nepasikeitė ir „Pig“ vykdymo laikas ją kviečia įgyti kitą duomenų paketą. Taikant šį metodą, įgyvendinimas turėtų naudoti pagrindinį „RecordReader“ ir sukonstruoti paketą, kad grįžtų.

Numatytieji diegimai „LoadFunc“:

Atkreipkite dėmesį, kad numatytieji „LoadFunc“ diegimai turėtų būti nepaisomi tik tada, kai to reikia.

__init__ pitonas
  • setUdfContextSignature ():

    Šį metodą kiaulė iškvies tiek priekinėje, tiek užpakalinėje dalyje, kad krautuvui perduotų unikalų parašą. Parašas gali būti naudojamas saugant bet kokią informaciją „UDFContext“, kurią krautuvas turi saugoti tarp įvairių metodų iškvietimų priekiniame ir galiniame galuose. Naudojimo atvejis yra jam perduoto „RequiredFieldList“ saugojimas aplanke „LoadPushDown.pushProjection“ („RequiredFieldList“), skirtas naudoti užpakalinėje dalyje, prieš grąžinant rinkinius „getNext“ (). Numatytasis „LoadFunc“ diegimo turinys yra tuščias. Šis metodas bus vadinamas prieš kitus metodus.

  • santykinisToAbsolutePath ():

    „Pig“ vykdymo laikas naudos šį metodą, kad krautuvas galėtų santykinę apkrovos vietą paversti absoliučia vieta. Numatytasis „LoadFunc“ numatytas diegimas tvarko tai „FileSystem“ vietose. Jei įkrovos šaltinis yra kažkas kitas, krautuvo diegimas gali pasirinkti tai nepaisyti.

Krautuvo įgyvendinimas pavyzdyje yra tekstinių duomenų krautuvas, kurio eilutės ribotuvas yra „
‘Ir‘ ‘kaip numatytasis lauko ribotuvas, panašus į dabartinį PigStorage krautuvą Pig. Diegimas naudoja esamą „Hadoop“ palaikomą „Inputformat“ - „TextInputFormat“ - kaip pagrindinį „InputFormat“.

public class „SimpleTextLoader“ išplečia „LoadFunc“ {apsaugotas „RecordReader“ = null privataus baito fieldDel = '' private ArrayList mProtoTuple = null privatus TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader * ( Kiaulių krautuvas, kuris naudoja nurodytą simbolį kaip lauko ribotuvą. * * @param delimiter * vieno baito simbolis, naudojamas atskirti laukus. * ('' yra numatytasis.) * / public SimpleTextLoader (String delimiter) {this () if (delimiter.length () == 1) {this.fieldDel = (baitas) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.charAt (0) == '') {switch (delimiter.charAt (1)) {atvejis 't': this.fieldDel = (baitas) '' pertraukos atvejis 'x' : fieldDel = Integer.valueOf (delimiter.substring (2), 16). byteValue () pertraukos atvejis „u“: this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () nutylėjimas: metimas naujas „RuntimeException“ („Nežinomas atribiklis“ + atribotojas)}} else {mestis naujas „RuntimeException“ („PigStorage delimetras turi būti vienas simbolis“)}} @ Nepaisyti viešo Tuple getNext () meta IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} Teksto vertė = (Tekstas) in.getCurrentValue () baitas [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iTurite mums klausimą? Prašau paminėti tai komentarų skiltyje ir mes su jumis susisieksime. 

Susijusios žinutės: