Apache Pig UDF: भाग 1 - Eval, Aggregate & Filter Functions

यह पोस्ट Apache Pig UDF - Eval, Aggregate & Filter Functions के बारे में बताती है। Eval, Aggregate & Filter Functions पर एक नज़र डालें।

अपाचे सुअर कस्टम प्रोसेसिंग को निर्दिष्ट करने के तरीके के रूप में उपयोगकर्ता परिभाषित कार्यों (यूडीएफ) के लिए व्यापक समर्थन प्रदान करता है। सुअर UDFs को वर्तमान में तीन भाषाओं में निष्पादित किया जा सकता है: जावा, पायथन, जावास्क्रिप्ट और रूबी। जावा कार्यों के लिए सबसे व्यापक समर्थन प्रदान किया गया है।





जावा यूडीएफ को कई तरीकों से लागू किया जा सकता है। सबसे सरल यूडीएफ केवल एवलफंक का विस्तार कर सकता है, जिसे लागू करने के लिए केवल निष्पादन फ़ंक्शन की आवश्यकता होती है। हर एवल यूडीएफ को इसे लागू करना चाहिए। इसके अतिरिक्त, यदि कोई फ़ंक्शन बीजगणितीय है, तो यह क्वेरी प्रदर्शन को बेहतर बनाने के लिए बीजगणितीय इंटरफ़ेस को लागू कर सकता है।

सुअर में यूडीएफ का महत्व:

सुअर यूडीएफ के माध्यम से उपयोगकर्ताओं को अपने या दूसरों के कोड के साथ मौजूदा ऑपरेटरों को संयोजित करने की अनुमति देता है। सुअर का लाभ यूडीएफ के माध्यम से उपयोगकर्ताओं को अपने स्वयं के या दूसरों के कोड के साथ अपने ऑपरेटरों को संयोजित करने की क्षमता है। संस्करण 0.7 के माध्यम से, सभी यूडीएफ को जावा में लिखा जाना चाहिए और जावा कक्षाओं के रूप में लागू किया जाना चाहिए। इससे जावा वर्ग लिखकर और सुअर फ़ाइल के बारे में सुअर को सूचित करके सुअर के लिए नए UDFs जोड़ना आसान हो जाता है।



कैसे जावा में एक कार्यक्रम से बाहर निकलने के लिए

सुअर खुद कुछ यूडीएफ के साथ आता है। संस्करण 0.8 से पहले, यह केवल मानक एसक्यूएल कुल कार्यों और कुछ अन्य लोगों के साथ एक बहुत ही सीमित सेट था। 0.8 में, बड़ी संख्या में मानक स्ट्रिंग-प्रसंस्करण, गणित और जटिल-प्रकार के यूडीएफ जोड़े गए थे।

पिगीबैंक क्या है?

पिगीबैंक उपयोगकर्ता-योगदान वाले यूडीएफ का एक संग्रह है जो सुअर के साथ जारी किया गया है। Piggybank UDFs सुअर JAR में शामिल नहीं हैं, इसलिए आपको उन्हें अपनी स्क्रिप्ट में मैन्युअल रूप से पंजीकृत करना होगा। आप अपने स्वयं के यूडीएफ भी लिख सकते हैं या अन्य उपयोगकर्ताओं द्वारा लिखे गए का उपयोग कर सकते हैं।

एवरल फंक्शंस

UDF वर्ग EvalFunc वर्ग का विस्तार करता है जो सभी Eval कार्यों के लिए आधार है। सभी मूल्यांकन कार्य जावा वर्ग का विस्तार करते हैं alu org.apache.pig.EvalFunc। Which यह UDF के रिटर्न प्रकार के साथ परिचालित होता है जो इस मामले में जावा स्ट्रिंग है। इस वर्ग में मुख्य विधि। निष्पादित है। ’कोड की पहली पंक्ति इंगित करती है कि फ़ंक्शन myudfs पैकेज का एक हिस्सा है।



यह एक रिकॉर्ड लेता है और एक परिणाम देता है, जिसे निष्पादन पाइपलाइन से गुजरने वाले हर रिकॉर्ड के लिए लागू किया जाएगा। यह एक tuple लेता है, जिसमें सभी फ़ील्ड शामिल होते हैं जो स्क्रिप्ट आपके UDF को इनपुट के रूप में देती है। फिर यह उस प्रकार को लौटाता है जिसके द्वारा आपने EvalFunc को पैरामीटर किया है।

जावा में क्या मतलब है

यह फ़ंक्शन हर इनपुट टपल पर लगाया जाता है। फ़ंक्शन में इनपुट, इनपुट मापदंडों के साथ एक टपल है, जिस क्रम में वे सुअर स्क्रिप्ट में फ़ंक्शन को पास किए जाते हैं। नीचे दिखाए गए उदाहरण में, फ़ंक्शन इनपुट के रूप में स्ट्रिंग लेता है। निम्न फ़ंक्शन स्ट्रिंग को लोअरकेस से अपरकेस में परिवर्तित करता है। अब जब फ़ंक्शन लागू हो गया है, तो इसे संकलित करने और एक JAR में शामिल करने की आवश्यकता है।

पैकेज myudfs import java.io.IO.ception आयात आयात org.apache.pig.EvalFunc import org.apache.pig.data.Tuple सार्वजनिक वर्ग UPPER का विस्तार EvalFunc {सार्वजनिक स्ट्रिंग निष्पादन (Tuple इनपुट) IOException {if (इनपुट == null) input.size () == 0) वापसी की कोशिश करें {स्ट्रिंग स्ट्रिंग = (स्ट्रिंग) input.get (0) वापसी str.toUpperCase ()} पकड़ (अपवाद ई) {नई IOException ('कॉल अपवाद अपवाद प्रसंस्करण पंक्ति' फेंकें,) इ) } } }

सकल कार्य:

एग्रीगेट फंक्शन एक और सामान्य प्रकार का एवल फंक्शन है। अलग-अलग कार्य आमतौर पर समूहीकृत डेटा पर लागू होते हैं। एग्रीगेट फ़ंक्शन एक बैग लेता है और एक स्केलर मान देता है। कई सकल कार्यों की एक दिलचस्प और मूल्यवान विशेषता यह है कि उन्हें वितरित तरीके से वृद्धिशील रूप से गणना की जा सकती है। Hadoop की दुनिया में, इसका मतलब है कि आंशिक गणना मैप और कॉम्बिनेटर द्वारा की जा सकती है और अंतिम परिणाम Reducer द्वारा गणना की जा सकती है।

यह सुनिश्चित करना बहुत महत्वपूर्ण है कि बीजगणित करने वाले सकल कार्य इस प्रकार कार्यान्वित किए जाते हैं। इस प्रकार के उदाहरणों में अंतर्निहित COUNT, MIN, MAX और AVERAGE शामिल हैं।

COUNT एक बीजीय कार्य का एक उदाहरण है जहां हम डेटा के सबसेट में तत्वों की संख्या की गणना कर सकते हैं और फिर अंतिम आउटपुट का उत्पादन करने के लिए मायने रखते हैं। COUNT फ़ंक्शन के कार्यान्वयन पर नज़र डालते हैं:

सार्वजनिक वर्ग COUNT का विस्तार EvalFunc लागू करता है बीजगणितीय {सार्वजनिक दीर्घ निष्पादन (टपल इनपुट) IOException {रिटर्न काउंट (इनपुट)} को सार्वजनिक स्ट्रिंग getInitial () {रिटर्न Initial.class.getName ()} सार्वजनिक स्ट्रिंग getIntermed () {वापसी Intermed.class पर फेंकता है। getName ()} सार्वजनिक स्ट्रिंग getFinal () {रिटर्न फ़ाइनल .class.getName ()} स्टेटिक पब्लिक क्लास इनिशियल इवाफ़लंक {पब्लिक टपल एग्ज़ाम्पल (ट्यूपल इनपुट) फैली IOException (रिटर्न TupleFactory.getInstance) () (न्यूटूपल (काउंट))। }} स्थिर सार्वजनिक वर्ग Intermed का विस्तार होता है EvalFunc {public Tuple exec (Tuple input) फेंकता है IOException {return TupleFactory.getInstance ()। newTuple (योग (इनपुट))}} static पब्लिक क्लास फाइनल EvalFunc {public ट्यूपल इनपुट (ट्यूपल इनपुट) को निकालता है। IOException {वापसी राशि (इनपुट)}} स्थिर संरक्षित लंबी गणना (ट्यूपल इनपुट) ExecException {ऑब्जेक्ट वैल्यूज = input.get (0) फेंकता है यदि (मान Instof DataBag) रिटर्न ((DataBag) मान) .size () अन्य (मान) उदाहरण मानचित्र) नया लॉन्ग लौटाएँ (((मैप्स) वैल्यूज़) .साइज़ ())} स्टैटिक प्रोटेक्टेड लॉन्ग योग (ट्यूपल I nput) ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) लंबी राशि = 0 के लिए (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next (फेंकता है) फेंकता है ) योग + = (दीर्घ) t.get (0)} वापसी योग}}

COUNT बीजगणितीय इंटरफ़ेस लागू करता है जो इस तरह दिखता है:

सार्वजनिक इंटरफ़ेस बीजगणित {सार्वजनिक स्ट्रिंग getInitial () सार्वजनिक स्ट्रिंग getIntermed () सार्वजनिक स्ट्रिंग getFInter (})

बीजगणितीय होने के लिए एक फ़ंक्शन के लिए, इसे बीजगणितीय इंटरफ़ेस को लागू करने की आवश्यकता होती है जिसमें EvalFrc से प्राप्त तीन वर्गों की परिभाषा शामिल होती है। अनुबंध यह है कि प्रारंभिक वर्ग के निष्पादन को एक बार बुलाया जाता है और मूल इनपुट टुपल को पास किया जाता है। इसका आउटपुट एक टपल है जिसमें आंशिक परिणाम होते हैं। इंटरम्ड क्लास के एक्ज़ीक्यूट फंक्शन को शून्य या अधिक बार कहा जा सकता है और इसके इनपुट को एक टूपल के रूप में लेता है जिसमें प्रारंभिक कक्षा द्वारा या आंशिक क्लास के पूर्व इनवॉइस द्वारा निर्मित आंशिक परिणाम होते हैं और एक अन्य आंशिक परिणाम के साथ एक ट्यूपल का उत्पादन करता है। अंत में, अंतिम वर्ग का निष्पादन कार्य कहा जाता है और अंतिम परिणाम एक स्केलर प्रकार के रूप में देता है।

सेलेनियम में चौखटे के प्रकार

फ़िल्टर कार्य:

फ़िल्टर फ़ंक्शंस एवल फ़ंक्शंस हैं जो बूलियन मान लौटाते हैं। इसका उपयोग कहीं भी किया जा सकता है बूलियन अभिव्यक्ति उपयुक्त है, जिसमें FILTER ऑपरेटर या Bincond अभिव्यक्ति शामिल है। Apache Pig पूरी तरह से बूलियन का समर्थन नहीं करता है, इसलिए फ़िल्टर फ़ंक्शंस does Foreach ’जैसे बयानों में दिखाई नहीं दे सकते, जहाँ परिणाम किसी अन्य ऑपरेटर के लिए आउटपुट होते हैं। हालाँकि, फ़िल्टर फ़ंक्शंस का उपयोग फ़िल्टर स्टेटमेंट में किया जा सकता है।

नीचे दिए गए उदाहरण इस्मिप्ट फ़ंक्शन को लागू करते हैं:

आयात java.io.IO.ception आयात java.util.Map आयात org.apache.pig.FilterFunc आयात org.apache.pig.PigException आयात org.apache.pig.backend.exacheionengine.ExecException आयात आयात org.apache.pig.data.DataBataBata import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * यह निर्धारित करें कि बैग या नक्शा खाली है या नहीं। * (पब्लिक क्लास IsEmpty, FilterFunc {@ ऑवरराइड पब्लिक बुलियन एक्ज़ीक्यूट (Tuple input) फेंकता है IOException {try {ऑब्जेक्ट वैल्यूज़ = input.get (0) अगर (वैल्यू Instof DataBag) रिटर्न ((DataBag) वैल्यूज़)) .size () == = फेंकता है 0 और अगर (मान इंस्टोफ़ मैप) रिटर्न ((मैप) मान)) .ize () == 0 {{इरेटकोड = 2102 स्ट्रिंग संदेश = '' खाली करने के लिए '' DataType.findTypeName (मान + +) का परीक्षण नहीं कर सकता। नई ExecException (संदेश, इरोड, PigException.BUG)}}} को पकड़ें (ExecException ee) {फेंक ee}}}