Apache Pig UDF: Bahagi 2 - Mga Pag-andar ng Load



Inilalarawan ng post na ito ang tungkol sa Apache Pig UDF - Mga Pag-andar ng Load. (Apache Pig UDF: Bahagi 2). Tingnan ang Mga Pag-andar ng Load ng Apache Pig UDF.

kung paano lumikha ng sesyon sa java

Ang post ngayon ay tungkol sa mga pag-andar ng Load sa Apache Pig. Ito ang karugtong ng unang post na sumakop sa mga pagpapaandar ng UDF tulad ng Eval, Filter at Aggregate. Mangyaring refter sa kanila para sa karagdagang impormasyon sa iba pang mga pagpapaandar ng Pig UDF.





Ang pagpapaandar ng karga ng Pig ay itinayo sa tuktok ng isang InputFormat ng isang Hadoop, ang klase na ginagamit ng Hadoop upang mabasa ang data. Ang InputFormat ay may dalawang layunin: Tinutukoy nito kung paano makakapag-split sa pagitan ng mga gawain sa mapa at nagbibigay ng isang RecordReader na nagreresulta sa mga pares na key-halaga bilang pag-input sa mga gawaing mapa. Ang batayang klase para sa pagpapaandar na pag-load ay ang LoadFunc.

Pag-andar ng Load - Pag-uuri:

Ang LoadFunc abstract class ay may tatlong pangunahing pamamaraan para sa paglo-load ng data at sa karamihan ng mga kaso ng paggamit ay sapat na upang pahabain ito. Mayroong tatlong iba pang mga opsyonal na interface na maaaring ipatupad upang makamit ang pinalawak na pag-andar:



  • LoadMetadata:

Ang LoadMetadata ay may mga pamamaraan upang harapin ang metadata. Karamihan sa pagpapatupad ng mga loader ay hindi kailangang ipatupad ito maliban kung nakikipag-ugnay sila sa isang metadata system. Ang paraan ng getSchema () sa interface na ito ay nag-aalok ng isang paraan para sa mga pagpapatupad ng loader upang makipag-usap tungkol sa iskema ng data pabalik sa Pig. Kung ang isang pagpapatupad ng loader ay nagbabalik ng data na binubuo ng mga patlang ng mga totoong uri, dapat itong magbigay ng iskema na naglalarawan sa data na bumalik sa pamamagitan ng getSchema () na pamamaraan. Ang iba pang mga pamamaraan ay nakikipag-usap sa iba pang mga uri ng metadata tulad ng mga key ng pagkahati at istatistika. Ang mga pagpapatupad ay maaaring ibalik ang mga null na halaga ng pagbabalik para sa mga pamamaraang ito kung hindi wasto ang mga ito para sa iba pang pagpapatupad.

  • LoadPushDown:

Ang LoadPushDown ay may iba't ibang mga pamamaraan upang itulak ang mga pagpapatakbo mula sa Pig runtime sa pagpapatupad ng loader. Sa kasalukuyan, ang pushProjection () na pamamaraan lamang ang tinatawag ng Pig upang makipag-usap sa loader, ang eksaktong mga patlang na kinakailangan sa script ng Pig. Maaaring piliin ng pagpapatupad ng loader na sumunod o hindi sumunod sa kahilingan. Kung nagpasya ang pagpapatupad ng loader na sumunod sa kahilingan, dapat itong ipatupad ang LoadPushDown upang mapabuti ang pagganap ng query.

  • pushProjection ():

Ipinapaalam ng pamamaraang ito ang LoadFunc, kung aling mga patlang ang kinakailangan sa script ng Baboy. Sa gayon paganahin ang LoadFunc upang mapahusay ang pagganap sa pamamagitan ng paglo-load lamang ng mga patlang na kinakailangan. ang pushProjection () ay kumukuha ng isang 'kinakailangangFieldList.' Ang 'kinakailanganFieldList' ay binabasa lamang at hindi mababago ng LoadFunc. Kasama sa 'requiredFieldList' ang isang listahan ng 'kinakailanganField', kung saan ang bawat 'kinakailangangField' ay nagpapahiwatig ng isang patlang na hinihiling ng Pig script at binubuo ng index, alias, uri at subFields. Gumagamit ang baboy ng index ng haligi na kinakailanganField.index upang makipag-usap sa LoadFunc tungkol sa mga patlang na kinakailangan ng script ng Pig. Kung ang kinakailangang patlang ay isang mapa, ipapasa ng Pig ang 'kinakailangangField.subFields' na naglalaman ng isang listahan ng mga key na kinakailangan ng mga Pig script para sa mapa.



  • LoadCaster:

Ang LoadCaster ay may mga diskarte upang mai-convert ang byte arrays sa mga tukoy na uri. Dapat ipatupad ito ng isang pagpapatupad ng loader kapag ang implicit o tahasang pag-cast mula sa mga patlang ng DataByteArray sa iba pang mga uri ay kailangang suportahan.

Ang klase ng abstract na LoadFunc ay ang pangunahing klase upang pahabain para sa pagpapatupad ng isang loader. Ang mga pamamaraan na kinakailangang ma-override ay ipinaliwanag sa ibaba:

  • getInputFormat ():

    Ang pamamaraang ito ay tinawag ng Pig upang makuha ang InputFormat na ginamit ng loader. Ang mga pamamaraan sa InputFormat ay tinawag ng Pig sa parehong fashion tulad ng Hadoop sa isang MapReduce Java program. Kung ang InputFormat ay isang naka-package na Hadoop, dapat na gamitin ng pagpapatupad ang bagong batay sa API, sa ilalim ng org.apache.hadoop.mapreduce. Kung ito ay isang pasadyang InputFormat, mas mahusay na ipatupad gamit ang bagong API sa org.apache.hadoop.mapreduce.

  • setLocation ():

    Ang pamamaraang ito ay tinawag ng Pig upang maiparating ang lokasyon ng pag-load sa loader. Kailangang gamitin ng loader ang pamamaraang ito upang maiparating ang parehong impormasyon sa pangunahing InputFormat. Ang pamamaraang ito ay tinatawag na maraming beses ng baboy.

  • ihandaToRead ():

    Sa pamamaraang ito, ang RecordReader na nauugnay sa InputFormat na ibinigay ng LoadFunc ay ipinapasa sa LoadFunc. Ang RecordReader ay maaari nang magamit ng pagpapatupad sa getNext () upang ibalik ang isang tuple na kumakatawan sa isang tala ng data pabalik sa Pig.

  • getNext ():

    Ang kahulugan ng getNext () ay hindi nagbago at tinawag ng Pig runtime upang makuha ang susunod na tuple sa data. Sa pamamaraang ito, dapat gamitin ng pagpapatupad ang pinagbabatayan ng RecordReader at buuin ang tuple upang bumalik.

Mga Default na Pagpapatupad sa LoadFunc:

Tandaan na ang mga default na pagpapatupad sa LoadFunc ay dapat lamang mai-override kung kinakailangan.

ano ang ginagawa ng bufferedreader sa java
  • setUdfContextSignature ():

    Ang pamamaraang ito ay tatawagan ng Pig, kapwa sa front end at back end upang pumasa sa isang natatanging pirma sa Loader. Ang pirma ay maaaring magamit upang mag-imbak ng anumang impormasyon sa UDFContext kung saan kailangang iimbak ng Loader sa pagitan ng iba't ibang mga invocation ng pamamaraan sa front end at back end. Ang isang case ng paggamit ay upang maiimbak ang RequiredFieldList na ipinasa dito sa LoadPushDown.pushProtion (RequiredFieldList) para magamit sa likurang dulo bago ibalik ang mga tuple sa getNext (). Ang default na pagpapatupad sa LoadFunc ay may walang laman na katawan. Tatawagin ang pamamaraang ito bago ang ibang mga pamamaraan.

  • relatifToAbsolutePath ():

    Tatawagan ng baboy runtime ang pamamaraang ito upang pahintulutan ang Loader na i-convert ang isang lokasyon ng pag-load sa isang ganap na lokasyon. Ang default na pagpapatupad na ibinigay sa LoadFunc ang humahawak nito para sa mga lokasyon ng FileSystem. Kung ang pinagmulan ng pag-load ay ibang bagay, maaaring piliin ng pagpapatupad ng loader na i-override ito.

Ang pagpapatupad ng loader sa halimbawa ay isang loader para sa data ng teksto na may line delimiter bilang '
‘At‘ ‘bilang default na tagatanggal ng patlang na katulad ng kasalukuyang PigStorage loader sa Pig. Gumagamit ang pagpapatupad ng isang mayroon nang suportadong Hadoop na Inputformat - TextInputFormat - bilang pinagbabatayan na InputFormat.

pampublikong klase ang SimpleTextLoader ay nagpapalawak ng LoadFunc {protektadong RecordReader in = null pribadong byte fieldDel = 'pribadong ArrayList mProtoTuple = null pribadong TupleFactory mTupleFactory = TupleFactory.getInstance () pribadong static final int BUFFER_SIZE = 1024 public SimpleTextLoader *) Ang loader ng baboy na gumagamit ng tinukoy na character bilang isang delimiter sa patlang. * * @param delimiter * ang solong byte character na ginagamit upang paghiwalayin ang mga patlang. * ('' ang default.) * / public SimpleTextLoader (String delimiter) {ito () kung (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} iba pa kung ( 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: magtapon ng bago Ang RuntimeException ('Unknown delimiter' + delimiter)}} iba pa {magtapon ng bagong RuntimeException ('PigStorage delimeter ay dapat isang solong character')}} @Override public Tuple getNext () ay nagtatapon ng IOException {subukan {boolean notDone = in.nextKeyValue () kung (notDone) {return null} Text halaga = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 para sa (int i = 0 iMay tanong ba sa amin? Mangyaring banggitin ito sa seksyon ng mga komento at babalikan ka namin. 

Mga Kaugnay na Post: