Apache Pig UDF: الجزء 1 - وظائف التقييم والتجميع والتصفية



يصف هذا المنشور حول Apache Pig UDF - وظائف التقييم والتجميع والتصفية. ألق نظرة على وظائف التقييم والتجميع والتصفية.

يوفر Apache Pig دعمًا شاملاً للوظائف التي يحددها المستخدم (UDFs) كطريقة لتحديد المعالجة المخصصة. يمكن حاليًا تنفيذ Pig UDFs بثلاث لغات: Java و Python و JavaScript و Ruby. يتم توفير الدعم الأكثر شمولاً لوظائف Java.





يمكن استدعاء Java UDFs من خلال طرق متعددة. يمكن لأبسط UDF فقط توسيع EvalFunc ، والذي يتطلب فقط تنفيذ وظيفة exec. يجب على كل Eval UDF تنفيذ هذا. بالإضافة إلى ذلك ، إذا كانت الوظيفة جبرية ، فيمكنها تنفيذ الواجهة الجبرية لتحسين أداء الاستعلام بشكل ملحوظ.

أهمية UDFs في الخنزير:

يسمح Pig للمستخدمين بدمج المشغلين الحاليين مع الكود الخاص بهم أو رمز الآخرين عبر UDFs. تتمثل ميزة Pig في قدرتها على السماح للمستخدمين بدمج مشغليها مع كودهم الخاص أو كود الآخرين عبر UDFs. حتى الإصدار 0.7 ، يجب كتابة جميع UDFs بلغة Java وتنفيذها كصفوف Java. هذا يجعل من السهل إضافة UDFs جديدة إلى Pig من خلال كتابة فصل Java وإبلاغ Pig عن ملف JAR.



الخنزير نفسه يأتي مع بعض UDFs. قبل الإصدار 0.8 ، كانت مجموعة محدودة للغاية مع وظائف SQL التجميعية القياسية وعدد قليل من الوظائف الأخرى. في 0.8 ، تمت إضافة عدد كبير من معالجة السلاسل القياسية والرياضيات والنوع المعقد UDFs.

فرز مجموعة c ++ تنازليًا

ما هو Piggybank؟

Piggybank عبارة عن مجموعة من UDFs التي يساهم بها المستخدم والتي تم إصدارها مع Pig. لا يتم تضمين Piggybank UDFs في Pig JAR ، لذلك عليك تسجيلها يدويًا في البرنامج النصي الخاص بك. يمكنك أيضًا كتابة UDFs الخاصة بك أو استخدام تلك المكتوبة بواسطة مستخدمين آخرين.

وظائف التقييم

تقوم فئة UDF بتوسيع فئة EvalFunc التي تعد الأساس لجميع وظائف Eval. تعمل جميع وظائف التقييم على توسيع فئة Java ‘org.apache.pig.EvalFunc. 'يتم تحديد معلماته بنوع إرجاع UDF وهو سلسلة Java في هذه الحالة. الطريقة الأساسية في هذه الفئة هي 'exec'. يشير السطر الأول من الكود إلى أن الوظيفة جزء من حزمة myudfs.



يأخذ سجلًا واحدًا ويعيد نتيجة واحدة ، والتي سيتم استدعاؤها لكل سجل يمر عبر مسار التنفيذ. يتطلب الأمر tuple ، والذي يحتوي على جميع الحقول التي يمررها البرنامج النصي إلى UDF الخاص بك كمدخل. ثم تقوم بإرجاع النوع الذي قمت بتحديد معلمات به EvalFunc.

يتم استدعاء هذه الوظيفة في كل مجموعة إدخال. الإدخال في الوظيفة عبارة عن مجموعة تحتوي على معلمات الإدخال بالترتيب الذي يتم تمريرها إلى الوظيفة في البرنامج النصي Pig. في المثال الموضح أدناه ، تأخذ الدالة سلسلة كمدخلات. تقوم الوظيفة التالية بتحويل السلسلة من الأحرف الصغيرة إلى الأحرف الكبيرة. الآن وقد تم تنفيذ الوظيفة ، يجب تجميعها وتضمينها في JAR.

package myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER extends EvalFunc {public String exec (Tuple input) تطرح IOException {if (input == null || input.size () == 0) إرجاع فارغ حاول {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {throw new IOException ('Caught استثناء معالجة صف الإدخال'، ه)}}}

وظائف مجمعة:

الدالات التجميعية هي نوع شائع آخر من وظائف Eval. يتم عادةً تطبيق الدالات التجميعية على البيانات المجمعة. تأخذ الدالة التجميعية حقيبة وتعيد قيمة عددية. ميزة مثيرة للاهتمام وقيمة للعديد من الوظائف التجميعية هي أنه يمكن حسابها بشكل متزايد بطريقة موزعة. في عالم Hadoop ، هذا يعني أنه يمكن إجراء الحسابات الجزئية بواسطة Map and Combiner ويمكن حساب النتيجة النهائية بواسطة Reducer.

من المهم جدًا التأكد من تنفيذ الدوال التجميعية التي تكون جبرية على هذا النحو. تتضمن أمثلة هذا النوع المضمنة COUNT و MIN و MAX و AVERAGE.

العد هو مثال على دالة جبرية حيث يمكننا حساب عدد العناصر في مجموعة فرعية من البيانات ثم جمع الأعداد لإنتاج ناتج نهائي. دعونا نلقي نظرة على تنفيذ وظيفة COUNT:

تمتد الفئة العامة COUNT إلى تطبيقات الجبر {public Long exec (Tuple input) يطرح IOException {return count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} public String getFinal () {return Final.class.getName ()} فئة عامة ثابتة تمتد الابتدائية EvalFunc {public Tuple exec (إدخال Tuple) تطرح IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} فئة عامة ثابتة Intermed تمتد لـ EvalFunc {public Tuple exec (إدخال Tuple) تطرح IOException {return TupleFactory.getInstance (). newTuple (sum (input)}} فئة عامة ثابتة Final extends EvalFunc {public Tuple exec (إدخال Tuple) IOException {return sum (input)}} ثابت العد الطويل المحمي (إدخال Tuple) يطرح ExecException {Object value = input.get (0) if (قيم المثيل من DataBag) ترجع ((DataBag) قيم) .size () وإلا إذا (قيم يعرض مثيل الخريطة) قيم طويلة جديدة (((خريطة)). size ())} محمي ثابت Long sum (Tuple i nput) يطرح ExecException و NumberFormatException {قيم DataBag = (DataBag) input.get (0) long sum = 0 لـ (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Long) t.get (0)} return sum}}

تقوم COUNT بتنفيذ الواجهة الجبرية التي تبدو كالتالي:

الواجهة العامة Algebraic {public String getInitial () public String getIntermed () public String getFinal ()}

لكي تكون الوظيفة جبرية ، فإنها تحتاج إلى تنفيذ الواجهة الجبرية التي تتكون من تعريف ثلاث فئات مشتقة من EvalFunc. العقد هو أن يتم استدعاء تنفيذ الفئة الأولية مرة واحدة ويتم تمريرها إلى مجموعة الإدخال الأصلية. ناتجها عبارة عن مجموعة تحتوي على نتائج جزئية. يمكن استدعاء دالة exec للفئة Intermed بصفر أو أكثر من المرات وتأخذ كمدخل لها مجموعة تحتوي على نتائج جزئية تم إنتاجها بواسطة الفئة الأولية أو عن طريق استدعاءات سابقة للفئة Intermed وتنتج مجموعة مع نتيجة جزئية أخرى. أخيرًا ، يتم استدعاء وظيفة exec للفئة النهائية وتعطي النتيجة النهائية كنوع قياسي.

وظائف المرشح:

وظائف التصفية هي دالات Eval ترجع قيمة منطقية. يمكن استخدامه في أي مكان يكون فيه التعبير المنطقي مناسبًا ، بما في ذلك عامل FILTER أو تعبير Bincond. لا يدعم Apache Pig Boolean تمامًا ، لذلك لا يمكن أن تظهر وظائف Filter في عبارات مثل 'Foreach' ، حيث يتم إخراج النتائج إلى مشغل آخر. ومع ذلك ، يمكن استخدام وظائف التصفية في عبارات التصفية.

ما هو الهاشمب في جافا

المثال أدناه يطبق وظيفة IsEmpty:

استيراد java.io.IOException استيراد java.util.Map import org.apache.pig.FilterFunc import org.apache.pig.PigException استيراد org.apache.pig.backend.executionengine.ExecException استيراد org.apache.pig.data.DataBag import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * تحديد ما إذا كانت الحقيبة أو الخريطة فارغة. * / فئة عامة IsEmpty تمتد إلى FilterFunc {Override public Boolean exec (إدخال Tuple) يطرح IOException {جرب {قيم الكائن = input.get (0) إذا كانت (قيم المثيل من DataBag) ترجع ((DataBag) قيم) .size () == 0 آخر إذا كانت (قيم المثيل من الخريطة) ترجع (قيم الخريطة). size () == 0 else {int errCode = 2102 String msg = 'لا يمكن اختبار '+ DataType.findTypeName (القيم) +' من أجل الفراغ. ' إلقاء ExecException الجديد (msg، errCode، PigException.BUG)}} catch (ExecException ee) {throw ee}}}