Apache Pig UDF: Μέρος 1 - Λειτουργίες Eval, Aggregate & Filter



Αυτή η ανάρτηση περιγράφει για το Apache Pig UDF - Eval, Aggregate & Filter Functions. Ρίξτε μια ματιά στις συναρτήσεις Eval, Aggregate & Filter.

Το Apache Pig παρέχει εκτεταμένη υποστήριξη για λειτουργίες που ορίζονται από το χρήστη (UDFs) ως τρόπος καθορισμού προσαρμοσμένης επεξεργασίας. Οι χοίροι UDF μπορούν να εκτελεστούν σε τρεις γλώσσες: Java, Python, JavaScript και Ruby. Η πιο εκτεταμένη υποστήριξη παρέχεται για λειτουργίες Java.





Τα UDF Java μπορούν να χρησιμοποιηθούν με πολλούς τρόπους. Το απλούστερο UDF μπορεί απλώς να επεκτείνει το EvalFunc, το οποίο απαιτεί μόνο την εκτέλεση της λειτουργίας exec. Κάθε Eval UDF πρέπει να το εφαρμόσει. Επιπλέον, εάν μια συνάρτηση είναι αλγεβρική, μπορεί να εφαρμόσει την αλγεβρική διεπαφή για να βελτιώσει σημαντικά την απόδοση του ερωτήματος.

τι είναι char σε java

Σημασία των UDFs στο χοίρο:

Το Pig επιτρέπει στους χρήστες να συνδυάζουν υπάρχοντες χειριστές με τον δικό τους ή άλλον κωδικό μέσω UDFs. Το πλεονέκτημα του Pig είναι η ικανότητά του να επιτρέπει στους χρήστες να συνδυάζουν τους χειριστές του με τον δικό τους ή άλλους κωδικούς μέσω UDFs. Μέχρι την έκδοση 0.7, όλα τα UDF πρέπει να είναι γραμμένα σε Java και να υλοποιούνται ως τάξεις Java. Αυτό διευκολύνει την προσθήκη νέων UDFs στο Pig γράφοντας μια τάξη Java και ενημερώνοντας το Pig για το αρχείο JAR.



Ο ίδιος ο χοίρος έρχεται με μερικά UDF. Πριν από την έκδοση 0.8, ήταν ένα πολύ περιορισμένο σετ με μόνο τις τυπικές συναρτήσεις SQL και μερικές άλλες. Στο 0.8, προστέθηκε ένας μεγάλος αριθμός τυπικής επεξεργασίας συμβολοσειρών, μαθηματικών και UDF σύνθετου τύπου.

Τι είναι το Piggybank;

Το Piggybank είναι μια συλλογή UDFs που συνεισφέρει ο χρήστης και κυκλοφορεί μαζί με το Pig. Τα UDF Piggybank δεν περιλαμβάνονται στο JAR Pig, επομένως πρέπει να τα καταχωρίσετε χειροκίνητα στο script σας. Μπορείτε επίσης να γράψετε τα δικά σας UDF ή να χρησιμοποιήσετε αυτά που έχουν γραφτεί από άλλους χρήστες.

Eval συναρτήσεις

Η τάξη UDF επεκτείνει την κλάση EvalFunc που αποτελεί τη βάση για όλες τις συναρτήσεις Eval. Όλες οι συναρτήσεις αξιολόγησης επεκτείνουν την κλάση Java «org.apache.pig.EvalFunc. «Παραμετροποιείται με τον τύπο επιστροφής του UDF που είναι Java String σε αυτήν την περίπτωση. Η βασική μέθοδος σε αυτήν την τάξη είναι «exec». Η 1η γραμμή του κώδικα δείχνει ότι η συνάρτηση είναι μέρος του πακέτου myudfs.



Χρειάζεται μία εγγραφή και επιστρέφει ένα αποτέλεσμα, το οποίο θα καλείται για κάθε εγγραφή που περνά μέσα από τον αγωγό εκτέλεσης. Παίρνει μια πλειάδα, η οποία περιέχει όλα τα πεδία που το σενάριο περνά στο UDF ως είσοδο. Στη συνέχεια επιστρέφει τον τύπο με τον οποίο έχετε παραμετροποιήσει το EvalFunc.

Αυτή η συνάρτηση ενεργοποιείται σε κάθε πλειάδα εισόδου. Η είσοδος στη συνάρτηση είναι μια πλειάδα με παραμέτρους εισόδου με τη σειρά που μεταβιβάζονται στη συνάρτηση στο σενάριο Pig. Στο παράδειγμα που φαίνεται παρακάτω, η συνάρτηση λαμβάνει συμβολοσειρά ως είσοδο. Η ακόλουθη συνάρτηση μετατρέπει τη συμβολοσειρά από πεζά σε κεφαλαία. Τώρα που η συνάρτηση έχει εφαρμοστεί, πρέπει να μεταγλωττιστεί και να συμπεριληφθεί σε ένα JAR.

τι συμβαίνει στην Ιάβα
πακέτο myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data. Το UPPER της δημόσιας τάξης επεκτείνει το EvalFunc {public String exec (Tuple input) ρίχνει το IOException {if (input == null || input.size () == 0) return null προσπαθήστε {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {ρίξτε νέο IOException ('Γραμμή εισόδου επεξεργασίας εξαίρεσης', ε)}}}

Συγκεντρωτικές λειτουργίες:

Οι συγκεντρωτικές συναρτήσεις είναι ένας άλλος κοινός τύπος συνάρτησης Eval. Οι συγκεντρωτικές συναρτήσεις συνήθως εφαρμόζονται σε ομαδοποιημένα δεδομένα. Η συνάρτηση Aggregate παίρνει μια τσάντα και επιστρέφει μια βαθμιαία τιμή. Ένα ενδιαφέρον και πολύτιμο χαρακτηριστικό πολλών συναθροίσεων είναι ότι μπορούν να υπολογιστούν σταδιακά με κατανεμημένο τρόπο. Στον κόσμο Hadoop, αυτό σημαίνει ότι οι μερικοί υπολογισμοί μπορούν να γίνουν από το Map and Combiner και το τελικό αποτέλεσμα μπορεί να υπολογιστεί από το Reducer.

Είναι πολύ σημαντικό να βεβαιωθείτε ότι οι συναθροιστικές συναρτήσεις που είναι αλγεβρικές εφαρμόζονται ως τέτοιες. Παραδείγματα αυτού του τύπου περιλαμβάνουν τα ενσωματωμένα COUNT, MIN, MAX και AVERAGE.

ΜΕΤΡΩ είναι ένα παράδειγμα μιας αλγεβρικής συνάρτησης όπου μπορούμε να μετρήσουμε τον αριθμό των στοιχείων σε ένα υποσύνολο των δεδομένων και στη συνέχεια να αθροίσουμε τις μετρήσεις για να παράγουμε μια τελική έξοδο. Ας δούμε την εφαρμογή της συνάρτησης COUNT:

εφαρμογή κατακερματισμού στο παράδειγμα java
δημόσια τάξη COUNT επεκτείνει το EvalFunc υλοποιεί Αλγεβρικό {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 input) ρίχνει IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} στατική δημόσια τάξη Intermed επεκτείνει το EvalFunc {public Tuple exec (Tuple input) ρίχνει το IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} Τελική δημόσια τάξη Final επεκτείνει το EvalFunc {public Tuple exec (Tuple input) IOException {return sum (input)}} στατικό προστατευμένο Long count (Tuple input) ρίχνει το ExecException {Object Values ​​= input.get (0) if (τιμές instanceof DataBag) τιμές επιστροφής ((DataBag)). Μέγεθος () αλλιώς εάν (τιμές instanceof Map) επιστροφή νέων τιμών Long (([Map)). μέγεθος ())} στατικό προστατευμένο Long sum (Tuple i nput) ρίχνει ExecException, NumberFormatException {DataBag τιμές = (DataBag) input.get (0) long sum = 0 for (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Long) t.get (0)} επιστροφή ποσού}}

Το COUNT εφαρμόζει την αλγεβρική διεπαφή που μοιάζει με αυτήν:

δημόσια διεπαφή Αλγεβρική {public String getInitial () public String getIntermed () public String getFinal ()}

Για να είναι μια συνάρτηση αλγεβρική, πρέπει να εφαρμόσει αλγεβρική διεπαφή που αποτελείται από ορισμό τριών τάξεων που προέρχονται από το EvalFunc. Η σύμβαση είναι ότι η εκτέλεση της αρχικής κλάσης καλείται μία φορά και μεταβιβάζεται στην αρχική πλειάδα εισόδου. Η έξοδος του είναι μια πλειάδα που περιέχει μερικά αποτελέσματα. Η συνάρτηση exec της κλάσης Intermed μπορεί να κληθεί μηδέν ή περισσότερες φορές και λαμβάνει ως είσοδο μια πλειάδα που περιέχει μερικά αποτελέσματα που παράγονται από την αρχική τάξη ή από προηγούμενες προσκλήσεις της κλάσης Intermed και παράγει μια πλειάδα με άλλο μερικό αποτέλεσμα. Τέλος, η συνάρτηση exec της Τελικής κλάσης καλείται και δίνει το τελικό αποτέλεσμα ως κλιμακούμενος τύπος.

Λειτουργίες φίλτρου:

Οι λειτουργίες φίλτρου είναι συναρτήσεις Eval που επιστρέφουν μια τιμή Boolean. Μπορεί να χρησιμοποιηθεί οπουδήποτε είναι κατάλληλη μια έκφραση Boolean, συμπεριλαμβανομένου του τελεστή FILTER ή της έκφρασης Bincond. Το Apache Pig δεν υποστηρίζει πλήρως το Boolean, επομένως οι λειτουργίες φίλτρου δεν μπορούν να εμφανίζονται σε δηλώσεις όπως το «Foreach», όπου τα αποτελέσματα εξάγονται σε άλλο χειριστή. Ωστόσο, οι λειτουργίες φίλτρου μπορούν να χρησιμοποιηθούν σε δηλώσεις φίλτρου.

Το παρακάτω παράδειγμα εφαρμόζει τη συνάρτηση IsEmpty:

εισαγωγή java.io.IOException εισαγωγή java.util.Map εισαγωγή org.apache.pig.FilterFunc εισαγωγή org.apache.pig.PigException εισαγωγή org.apache.pig.backend.executionengine.ExecException εισαγωγή org.apache.pig.data.DataBag εισαγωγή org.apache.pig.data. Διπλή εισαγωγή org.apache.pig.data.DataType / ** * Προσδιορίστε εάν μια τσάντα ή ένας χάρτης είναι κενός. * / η δημόσια κλάση IsEmpty επεκτείνει το FilterFunc {@Override public Boolean exec (Tuple input) ρίχνει το IOException {try {Object Values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag)) .size () == 0 αλλιώς εάν (τιμές instanceof Map) επιστρέφουν ((Map) τιμές). Size () == 0 else {int errCode = 2102 String msg = 'Δεν είναι δυνατή η δοκιμή ενός' + DataType.findTypeName (τιμές) + 'για το κενό.' ρίξτε νέο ExecException (msg, errCode, PigException.BUG)}} catch (ExecException ee) {throw ee}}}