Apache Pig UDF: الجزء 2 - وظائف التحميل



يصف هذا المنشور حول Apache Pig UDF - وظائف التحميل. (Apache Pig UDF: الجزء 2). ألقِ نظرة على وظائف التحميل في Apache Pig UDF.

انفورماتيكا تعليمي للمبتدئين pdf تحميل مجاني

تدور مشاركة اليوم حول وظائف التحميل في Apache Pig. هذا هو تكملة ل أول منشور التي غطت وظائف UDF مثل Eval و Filter و Aggregate. يرجى إعادة توجيهها إليهم لمزيد من المعلومات حول الوظائف الأخرى لـ Pig UDF.





تم إنشاء وظيفة تحميل Pig أعلى تنسيق InputFormat الخاص بـ Hadoop ، وهو الفئة التي يستخدمها Hadoop لقراءة البيانات. يحتوي InputFormat على غرضين: يحدد كيفية تجزئة المدخلات بين مهام الخريطة ويوفر RecordReader الذي ينتج عنه أزواج مفتاح - قيمة كمدخلات لمهام الخريطة هذه. الفئة الأساسية لوظيفة التحميل هي LoadFunc.

وظيفة التحميل - التصنيف:

تحتوي فئة LoadFunc abstract على ثلاث طرق رئيسية لتحميل البيانات وفي معظم حالات الاستخدام يكفي تمديدها. هناك ثلاث واجهات اختيارية أخرى يمكن تنفيذها لتحقيق وظائف موسعة:



  • تحميل البيانات الوصفية:

يحتوي LoadMetadata على طرق للتعامل مع البيانات الوصفية. لا تحتاج معظم أدوات التحميل إلى تنفيذ ذلك ما لم تتفاعل مع نظام البيانات الوصفية. توفر طريقة getSchema () في هذه الواجهة طريقة لتطبيقات أداة التحميل للتواصل حول مخطط البيانات إلى Pig. إذا أرجع تنفيذ أداة التحميل بيانات تتكون من حقول من أنواع حقيقية ، فيجب أن توفر مخططًا يصف البيانات التي يتم إرجاعها من خلال طريقة getSchema (). تتعامل الطرق الأخرى مع أنواع أخرى من البيانات الوصفية مثل مفاتيح الأقسام والإحصائيات. يمكن أن تُرجع عمليات التنفيذ قيم إرجاع فارغة لهذه الطرق إذا لم تكن صالحة للتطبيق الآخر.

  • LoadPushDown:

يحتوي LoadPushDown على طرق مختلفة لدفع العمليات من وقت تشغيل Pig إلى تطبيقات اللودر. حاليًا ، يتم استدعاء طريقة pushProject () فقط بواسطة Pig للتواصل مع المحمل ، وهي الحقول الدقيقة المطلوبة في البرنامج النصي Pig. يمكن أن يختار تطبيق اللودر الالتزام أو عدم الالتزام بالطلب. إذا قرر تطبيق المُحمل الالتزام بالطلب ، فيجب عليه تنفيذ LoadPushDown لتحسين أداء الاستعلام.

  • دفع إسقاط ():

تقوم هذه الطريقة بإعلام LoadFunc ، أي الحقول مطلوبة في البرنامج النصي Pig. وبالتالي تمكين LoadFunc لتحسين الأداء عن طريق تحميل الحقول المطلوبة فقط. تأخذ pushProject () 'requiredFieldList.' 'requiredFieldList' للقراءة فقط ولا يمكن تغييره بواسطة LoadFunc. تتضمن 'requiredFieldList' قائمة 'requiredField' ، حيث يشير كل 'requiredField' إلى حقل مطلوب بواسطة البرنامج النصي Pig ويتكون من فهرس واسم مستعار ونوع وحقول فرعية. يستخدم Pig فهرس العمود requiredField.index للتواصل مع LoadFunc حول الحقول المطلوبة بواسطة البرنامج النصي Pig. إذا كان الحقل المطلوب عبارة عن خريطة ، فسيمرر Pig 'requiredField.subFields' الذي يحتوي على قائمة بالمفاتيح المطلوبة بواسطة البرامج النصية Pig للخريطة.



كيف تكتب فئة فردية في جافا
  • تحميل:

يحتوي LoadCaster على تقنيات لتحويل مصفوفات البايت إلى أنواع محددة. يجب أن يقوم تطبيق المُحمل بتنفيذ ذلك عند الحاجة إلى دعم عمليات التحويل الضمنية أو الصريحة من حقول DataByteArray إلى أنواع أخرى.

فئة LoadFunc abstract هي الفئة الرئيسية التي يتم تمديدها لتنفيذ أداة تحميل. الطرق المطلوب تجاوزها موضحة أدناه:

  • getInputFormat ():

    يتم استدعاء هذه الطريقة بواسطة Pig للحصول على InputFormat الذي يستخدمه المحمل. يتم استدعاء الأساليب الموجودة في InputFormat بواسطة Pig بنفس طريقة Hadoop في برنامج MapReduce Java. إذا كان InputFormat عبارة عن حزمة Hadoop ، فيجب أن يستخدم التطبيق واجهة API الجديدة القائمة ، ضمن org.apache.hadoop.mapreduce. إذا كان تنسيق InputFormat مخصصًا ، فمن الأفضل أن يتم تنفيذه باستخدام واجهة برمجة التطبيقات الجديدة في org.apache.hadoop.mapreduce.

  • تحديد المكان():

    يتم استدعاء هذه الطريقة بواسطة Pig لإيصال موقع التحميل إلى المحمل. يحتاج المُحمل إلى استخدام هذه الطريقة لتوصيل نفس المعلومات إلى تنسيق InputFormat الأساسي. هذه الطريقة تسمى عدة مرات بواسطة الخنزير.

  • تحضير للقراءة ():

    في هذه الطريقة ، يتم تمرير RecordReader المتعلق بـ InputFormat الذي يوفره LoadFunc إلى LoadFunc. يمكن الآن استخدام RecordReader بواسطة التنفيذ في getNext () لإرجاع مجموعة تمثل سجلًا من البيانات إلى Pig.

  • getNext ():

    لم يتغير معنى getNext () ويتم استدعاؤه بواسطة Pig runtime للحصول على المجموعة التالية في البيانات. في هذه الطريقة ، يجب أن يستخدم التطبيق RecordReader الأساسي وأن يُنشئ tuple للعودة.

عمليات التنفيذ الافتراضية في LoadFunc:

لاحظ أنه يجب تجاوز عمليات التنفيذ الافتراضية في LoadFunc فقط عند الحاجة.

جافا الفرق بين الأدوات ويمتد
  • setUdfContextSignature ():

    سيتم استدعاء هذه الطريقة بواسطة Pig ، في كل من الواجهة الأمامية والنهاية الخلفية لتمرير توقيع فريد إلى اللودر. يمكن استخدام التوقيع لتخزين أي معلومات في UDFContext الذي يحتاج اللودر لتخزينه بين استدعاءات الطريقة المختلفة في الواجهة الأمامية والنهاية الخلفية. حالة الاستخدام هي تخزين RequiredFieldList الذي تم تمريره إليه في LoadPushDown.pushProject (RequiredFieldList) للاستخدام في النهاية الخلفية قبل إرجاع المجموعات في getNext (). يحتوي التطبيق الافتراضي في LoadFunc على نص فارغ. سيتم استدعاء هذه الطريقة قبل الطرق الأخرى.

  • RelativeToAbsolutePath ():

    سيستدعي وقت تشغيل الخنزير هذه الطريقة للسماح للمحمل بتحويل موقع تحميل نسبي إلى موقع مطلق. يعالج التطبيق الافتراضي المتوفر في LoadFunc هذا لمواقع FileSystem. إذا كان مصدر التحميل شيئًا آخر ، فقد يختار تنفيذ أداة التحميل تجاوز ذلك.

يعد تنفيذ أداة التحميل في المثال أداة تحميل للبيانات النصية بمحدد سطر مثل '
'و' كمحدد حقل افتراضي مشابه لمحمل PigStorage الحالي في Pig. يستخدم التنفيذ تنسيق Inputformat - TextInputFormat المدعوم من Hadoop - باعتباره تنسيق InputFormat الأساسي.

يوسع SimpleTextLoader من الفئة العامة LoadFunc {RecordReader المحمي في = null private byte fieldDel = '' Private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 SimpleTextLoader * {) محمل الخنازير الذي يستخدم حرفًا محددًا كمحدد حقل. * *param delimiter * حرف البايت المفرد المستخدم لفصل الحقول. * ('' هو الافتراضي.) * / public SimpleTextLoader (String delimiter) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if ( 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 () كسر الحالة 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () كسر الافتراضي: رمي جديدًا RuntimeException ('Unknown delimiter' + delimiter)}} else {throw new RuntimeException ('PigStorage delimeter must be a single character')}}Override public Tuple getNext () يطرح IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} قيمة النص = (نص) in.getCurrentValue () بايت [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 لـ (int i = 0 iلديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات وسنعاود الاتصال بك. 

المنشورات ذات الصلة: