Apache Pig UDF: Bahagi 1 - Mga Pag-andar ng Eval, Aggregate at Filter



Inilalarawan ng post na ito ang tungkol sa Apache Pig UDF - Mga Pag-andar ng Eval, Aggregate at Filter. Tingnan ang Mga Pag-andar ng Eval, Aggregate & Filter.

Nagbibigay ang Apache Pig ng malawak na suporta para sa mga function na tinukoy ng gumagamit (UDFs) bilang isang paraan upang tukuyin ang pasadyang pagproseso. Ang mga UDF ng baboy ay maaaring maipatupad sa tatlong wika: Java, Python, JavaScript at Ruby. Ang pinakamalawak na suporta ay ibinibigay para sa mga pagpapaandar ng Java.





Ang mga Java UDF ay maaaring makuha sa maraming paraan. Ang pinakasimpleng UDF ay maaari lamang palawakin ang EvalFunc, na nangangailangan lamang ng pagpapaandar ng exec na ipatupad. Dapat ipatupad ito ng bawat Eval UDF. Bilang karagdagan, kung ang isang pagpapaandar ay algebraic, maaari itong ipatupad ang interface ng Algebraic upang makabuluhang mapabuti ang pagganap ng query.

kung paano i-convert ang doble sa int java

Kahalagahan ng UDFs sa Pig:

Pinapayagan ng Pig ang mga gumagamit na pagsamahin ang mayroon nang mga operator sa kanilang sariling code ng iba sa pamamagitan ng mga UDF. Ang bentahe ng Pig ay ang kakayahang hayaan ang mga gumagamit na pagsamahin ang mga operator nito sa kanilang sariling code ng iba sa pamamagitan ng UDFs. Hanggang sa bersyon 0.7, ang lahat ng UDF ay dapat na nakasulat sa Java at ipinatupad bilang mga klase sa Java. Ginagawa nitong mas madali upang magdagdag ng mga bagong UDF sa Baboy sa pamamagitan ng pagsulat ng isang klase sa Java at pagpapaalam sa Pig tungkol sa JAR file.



Ang baboy mismo ay may kasamang ilang mga UDF. Bago ang bersyon 0.8, ito ay isang napaka-limitadong hanay na may lamang ang karaniwang mga pag-andar ng pinagsamang SQL at ilang iba pa. Sa 0.8, isang malaking bilang ng karaniwang pamantayan sa pagproseso ng string, matematika, at mga kumplikadong uri ng UDF ay naidagdag.

Ano ang isang Piggybank?

Ang Piggybank ay isang koleksyon ng mga naiambag na gumagamit ng UDF na inilabas kasama ang Pig. Ang mga Piggybank UDF ay hindi kasama sa Pig JAR, kaya kailangan mong irehistro ang mga ito nang manu-mano sa iyong script. Maaari mo ring isulat ang iyong sariling mga UDF o gamitin ang mga nakasulat ng iba pang mga gumagamit.

Mga Pag-andar ng Eval

Pinahaba ng klase ng UDF ang klase ng EvalFunc na siyang batayan para sa lahat ng mga pagpapaandar ng Eval. Ang lahat ng mga pagpapaandar sa Ebalwasyon ay nagpapahaba sa klase ng Java na ‘org.apache.pig.EvalFunc. 'Ito ay parameterized sa uri ng pagbabalik ng UDF na isang Java String sa kasong ito. Ang pangunahing pamamaraan sa klase na ito ay ang 'exec.' Ang ika-1 linya ng code ay nagpapahiwatig na ang pagpapaandar ay isang bahagi ng myudfs package.



Tumatagal ito ng isang talaan at nagbabalik ng isang resulta, na kung saan ay tatawagin para sa bawat record na dumaan sa pipeline ng pagpapatupad. Tumatagal ito ng isang tuple, na naglalaman ng lahat ng mga patlang na ipinapasa ng script sa iyong UDF bilang isang input. Pagkatapos ay ibabalik nito ang uri kung saan mo na-parameter ang EvalFunc.

Ang pagpapaandar na ito ay tinawag sa bawat input tuple. Ang pag-input sa pagpapaandar ay isang tuple na may mga input parameter sa pagkakasunud-sunod na ipinapasa sa pagpapaandar sa Pig script. Sa halimbawang ipinakita sa ibaba, ang function ay tumatagal ng string bilang input. Ang sumusunod na pag-andar ay nagko-convert ng string mula sa maliliit hanggang sa malalaki. Ngayon na ipinatupad ang pagpapaandar, kailangan itong maiipon at isama sa isang JAR.

kung paano gumawa ng isang hanay ng mga bagay sa java
package myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data. Nag-uupit ang Uppass na pampublikong klase ng UPPER ng EvalFunc {public String exec (input ng Tuple) ay nagtatapon ng IOException {kung (input == null || input.size () == 0) ibalik ang null subukan ang {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {magtapon ng bagong IOException ('Nahuli ang pagpasok sa pagpasok ng pagpasok ng pagpasok', e)}}}

Pinagsamang Mga Pag-andar:

Ang pinagsamang mga pagpapaandar ay isa pang karaniwang uri ng pagpapaandar ng Eval. Ang pinagsamang mga pagpapaandar ay karaniwang inilalapat sa naka-pangkat na data. Ang Aggregate function ay tumatagal ng isang bag at nagbabalik ng isang halaga ng scalar. Ang isang kawili-wili at mahalagang tampok ng maraming mga pagpapaandar na Pinagsama-sama ay maaari silang makalkula nang paunti-unti sa isang pamamahagi na pamamaraan. Sa mundo ng Hadoop, nangangahulugan ito na ang bahagyang mga pagkalkula ay maaaring gawin ng Mapa at Combiner at ang huling resulta ay maaaring makalkula ng Reducer.

Napakahalaga upang matiyak na ang mga pagpapaandar na Aggregate na algebraic ay ipinatupad tulad nito. Kasama sa mga halimbawa ng ganitong uri ang built-in na COUNT, MIN, MAX at AVERAGE.

BILANG ay isang halimbawa ng isang pagpapaandar na algebraic kung saan maaari nating bilangin ang bilang ng mga elemento sa isang subset ng data at pagkatapos ay buuin ang mga bilang upang makabuo ng isang pangwakas na output. Tingnan natin ang pagpapatupad ng COUNT function:

makakuha ng laki ng array javascript
pampublikong klase COUNT pinahaba ang EvalFunc nagpapatupad ng Algebraic {public Long exec (Tuple input) na nagtatapon ng IOException {count count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} public String getFinal () {return Final.class.getName ()} static public class Initial extends EvalFunc {public Tuple exec (Tuple input) throws IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} static na klase sa publiko na Intermed ay nagpapalawak ng EvalFunc {public Tuple exec (input ng Tuple) ay nagtatapon ng IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} static public class Final na nagpapalawak ng EvalFunc {public Tuple exec (Tuple input) throws Ang IOException {return sum (input)}} static na protektado Long count (Tuple input) ay nagtatapon ng ExecException {Mga halaga ng object = input.get (0) kung (mga halimbawang halimbawa ng DataBag) na bumalik ((DataBag) na mga halaga). Laki () iba pa kung (mga halaga halimbawang Map) ibalik ang bagong mga halagang Mahaba (((Mapa)). laki ())} protektado ng static na Long sum (Tuple i nput) itinapon ang ExecException, NumberFormatException {DataBag halaga = (DataBag) input.get (0) mahabang kabuuan = 0 para sa (Iterator (Tuple) ito = halaga.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Long) t.get (0)} return sum}}

COUNT nagpapatupad ng interface ng Algebraic na ganito ang hitsura:

pampublikong interface Algebraic {public String getInitial () public String getIntermed () public String getFinal ()}

Para sa isang pagpapaandar na maging algebraic, kailangan nitong ipatupad ang interface ng Algebraic na binubuo ng kahulugan ng tatlong mga klase na nagmula sa EvalFunc. Ang kontrata ay ang hindi pagpapaandar ng Paunang klase ay tinatawag na isang beses at ipinasa sa orihinal na input tuple. Ang output nito ay isang tuple na naglalaman ng bahagyang mga resulta. Ang pagpapaandar ng exec ng klase ng Intermed ay maaaring tawaging zero o higit pang beses at tumatagal bilang input nito ng isang tuple na naglalaman ng bahagyang mga resulta na ginawa ng Paunang klase o ng mga paunang pag-uusap ng klase ng Intermed at gumagawa ng isang tuple na may isa pang bahagyang resulta. Panghuli, ang pagpapaandar ng exec ng Pangwakas na klase ay tinawag at nagbibigay ng pangwakas na resulta bilang isang uri ng scalar.

Mga Pag-andar ng Filter:

Ang mga function ng filter ay mga function na Eval na nagbabalik ng halaga ng Boolean. Maaari itong magamit kahit saan ang isang expression ng Boolean ay naaangkop, kasama ang operator ng FILTER o ekspresyon ng Bincond. Hindi suportado ng Apache Pig ang Boolean nang buo, kaya ang mga pag-andar ng Filter ay hindi maaaring lumitaw sa mga pahayag tulad ng 'Foreach', kung saan ang mga resulta ay output sa ibang operator. Gayunpaman, maaaring magamit ang mga pag-andar ng Filter sa mga pahayag ng filter.

Ang halimbawa sa ibaba ay nagpapatupad ng pagpapaandar ng IsEmpty:

i-import ang java.io.IOException i-import ang java.util.Map i-import ang org.apache.pig.FilterFunc i-import ang org.apache.pig.PigException import org.apache.pig.backend.excementengine.ExecException import org.apache.pig.data.DataBag i-import ang org.apache.pig.data. I-upgrade ang pag-import org.apache.pig.data. DataType / ** * Tukuyin kung ang isang bag o mapa ay walang laman. * / pampubliko na klase ng IsEmpty ay pinahahaba ang FilterFunc {@Override public Boolean exec (Tuple input) na nagtatapon ng IOException {subukan {Mga halaga ng halaga = input.get (0) kung (mga halimbawang halimbawa ng DataBag) na bumalik ((DataBag) na mga halaga). laki 0 pa kung ang (mga halimbawang halimbawa ng Mapa) ay magbabalik ((Mga mapa) na halaga). Laki () == 0 pa {int errCode = 2102 String msg = 'Hindi masubukan ang isang' + DataType.findTypeName (mga halaga) + 'para sa kawalan.' magtapon ng bagong ExecException (msg, errCode, PigException.BUG)}} catch (ExecException ee) {throw ee}}}