Apache Pig UDF: पार्ट 2 - लोड फंक्शंस

यह पोस्ट Apache Pig UDF - लोड फ़ंक्शंस के बारे में बताता है। (अपाचे सुअर यूडीएफ: भाग 2)। Apache Pig UDF के लोड फंक्शंस पर एक नज़र डालें।

आज की पोस्ट Apache Pig में लोड फ़ंक्शन के बारे में है। यह अगली कड़ी है पहिला पद जो यूडीएफ कार्यों जैसे कि एवल, फिल्टर और एग्रीगेट को कवर करता है। सुअर UDF के अन्य कार्यों के बारे में अधिक जानकारी के लिए कृपया उन्हें फिर से देखें।





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

लोड समारोह - वर्गीकरण:

LoadFunc अमूर्त वर्ग में डेटा लोड करने के लिए तीन मुख्य तरीके हैं और ज्यादातर उपयोग के मामलों में इसे विस्तारित करने के लिए पर्याप्त होगा। तीन अन्य वैकल्पिक इंटरफेस हैं जिन्हें विस्तारित कार्यक्षमता प्राप्त करने के लिए लागू किया जा सकता है:



  • लोडमेटेटा:

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

  • LoadPushDown:

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

जावा में एक्सेल फाइल पढ़ें और लिखें
  • pushProjection():

यह विधि LoadFunc को सूचित करती है कि सुअर स्क्रिप्ट में कौन से फ़ील्ड आवश्यक हैं। इस प्रकार केवल उन फ़ील्ड्स को लोड करके प्रदर्शन बढ़ाने के लिए LoadFunc को सक्षम करना आवश्यक है। pushProjection () एक F आवश्यकफिल्डलिस्ट लेता है। ield L अपेक्षितफिल्डलिस्ट ’केवल पढ़ा जाता है और इसे लोडफंक द्वारा नहीं बदला जा सकता है। ‘आवश्यकफिल्डलिस्ट’ में ield अपेक्षितफिल्ड ’की एक सूची शामिल है, जहां प्रत्येक F आवश्यकफिल्ड’ पिग स्क्रिप्ट द्वारा आवश्यक फ़ील्ड को इंगित करता है और इसमें सूचकांक, उपनाम, प्रकार और उप-फ़ील्ड शामिल हैं। सुअर, स्क्रिप्ट के लिए आवश्यक फ़ील्ड के बारे में LoadFunc के साथ संवाद करने के लिए, स्तंभ सूचकांक आवश्यकField.index का उपयोग करता है। यदि आवश्यक फ़ील्ड एक नक्शा है, तो सुअर ield आवश्यक sField.subFields ’को पारित करेगा जिसमें मानचित्र के लिए सुअर स्क्रिप्ट द्वारा आवश्यक कुंजियों की एक सूची शामिल है।



  • लोडकैस्टर:

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

LoadFunc अमूर्त वर्ग एक लोडर को लागू करने के लिए विस्तार करने के लिए मुख्य वर्ग है। जिन तरीकों को ओवरराइड करना आवश्यक है, उन्हें नीचे समझाया गया है:

  • getInputFormat ():

    इस विधि को लोडर द्वारा इनपुटफॉरमेट का उपयोग करने के लिए सुअर द्वारा बुलाया जाता है। InputFormat की विधियाँ उसी तरह से सुअर द्वारा पुकार ली जाती हैं जैसे कि MapReduce Java प्रोग्राम में Hadoop। यदि InputFormat एक Hadoop पैक है, तो कार्यान्वयन को org.apache.hadoop.mapreduce के तहत नए API का उपयोग करना चाहिए। यदि यह एक कस्टम InputFormat है, तो org.apache.hadoop.mapreduce में नए API का उपयोग करके इसे लागू किया जाना बेहतर है।

  • स्थान तय करें():

    इस विधि को लोडर को लोड स्थान संवाद करने के लिए सुअर द्वारा बुलाया जाता है। लोडर को इस जानकारी का उपयोग कोर InputFormat को उसी जानकारी को संप्रेषित करने के लिए करने की आवश्यकता है। इस विधि को सुअर द्वारा कई बार कहा जाता है।

  • तैयारट्रेड ():

    इस विधि में, LoadFunc द्वारा प्रदत्त InputFormat से संबंधित RecordReader को LoadFunc को पास किया जाता है। RecordReader का उपयोग अब getNext () में कार्यान्वयन के द्वारा किया जा सकता है, जो टॉगल को वापस सुअर के डेटा के रिकॉर्ड का प्रतिनिधित्व करता है।

  • getNext ():

    गेटनेक्स्ट () का अर्थ नहीं बदला है और इसे डेटा में अगला टपल प्राप्त करने के लिए पिग रनटाइम द्वारा कहा जाता है। इस पद्धति में, कार्यान्वयन को अंतर्निहित RecordReader का उपयोग करना चाहिए और वापस जाने के लिए ट्यूपल का निर्माण करना चाहिए।

LoadFunc में डिफ़ॉल्ट कार्यान्वयन:

ध्यान रखें कि LoadFunc में डिफ़ॉल्ट कार्यान्वयन केवल जरूरत होने पर ओवरराइड किया जाना चाहिए।

जावा में मूल्य कैसे पास करें
  • setUdfContextSignature ():

    यह विधि सुअर द्वारा बुलाई जाएगी, दोनों फ्रंट एंड बैक एंड में दोनों लोडर को एक अद्वितीय हस्ताक्षर पास करने के लिए। हस्ताक्षर का उपयोग UDFContext में किसी भी जानकारी को संग्रहीत करने के लिए किया जा सकता है, जिसे लोडर को आगे और पीछे के अंत में विभिन्न विधि चालान के बीच संग्रहीत करने की आवश्यकता होती है। एक उपयोग का मामला है RequiredFieldList को GetNext () में ट्यूपल्स लौटने से पहले पिछले छोर में उपयोग के लिए LoadPushDown.pushProjection (RequiredFieldList) में इसे पारित करने के लिए। LoadFunc में डिफ़ॉल्ट कार्यान्वयन के पास एक खाली निकाय है। इस विधि को अन्य तरीकों से पहले बुलाया जाएगा।

  • रिश्तेदारटौब्सोल्यूटपैथ ():

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

उदाहरण में लोडर कार्यान्वयन लाइन डेलिमर के साथ line के रूप में पाठ डेटा के लिए एक लोडर है
‘और field field डिफ़ॉल्ट क्षेत्र के रूप में‘ ‘सुअर में वर्तमान PigStorage लोडर के समान सीमांकक। कार्यान्वयन एक मौजूदा Hadoop समर्थित Inputformat - TextInputFormat - अंतर्निहित InputFormat के रूप में उपयोग करता है।

public class SimpleTextLoader फैली हुई है LoadFunc {संरक्षित RecordReader in = null Private byte fieldDel = '' Private ArrayList mProtoTuple = null निजी TupleFactory mTupelFactory = TupleFactory.getInstance () निजी स्थिर अंतिम अंतर BUFFER_SIZE = 1024% सुअर लोडर जो एक क्षेत्र सीमांकक के रूप में निर्दिष्ट चरित्र का उपयोग करता है। * * @ अपरम डिमाइटर * एकल बाइट चरित्र जो खेतों को अलग करने के लिए उपयोग किया जाता है। * ('' डिफ़ॉल्ट है।) * / public SimpleTextLoader (स्ट्रिंग सीमांकक) {यह () यदि (delimiter.length () == 1) {this.fieldDel = (बाइट) delimiter.charAt (0)} अन्य (यदि delimiter.length ()> 1 & delimiter.charAt (0) == '') {स्विच (delimiter.charAt (1)) {केस 't': this.fieldDel = (बाइट) 'ब्रेक केस' x ' : fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () ब्रेक केस 'u': this.fieldDel = Integer.valueOf (deliteriter.substring (2))। byteValue () ब्रेक डिफॉल्ट: थ्रो न्यू। RuntimeException ('अज्ञात सीमांकक' + सीमांकक)}} {{नया फेंकें RuntimeException ('PigStorage delimeter एक एकल वर्ण होना चाहिए')}}} (notDone) {वापसी शून्य} पाठ मान = (पाठ) in.getCurrentValue () बाइट [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 i)क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? कृपया टिप्पणी अनुभाग में इसका उल्लेख करें और हम आपके पास वापस आ जाएंगे। 

संबंधित पोस्ट: