Apache Pig UDF: Μέρος 2 - Λειτουργίες φόρτωσης

Αυτή η ανάρτηση περιγράφει το Apache Pig UDF - Λειτουργίες φόρτωσης. (Apache Pig UDF: Μέρος 2). Ρίξτε μια ματιά στις λειτουργίες φόρτωσης του Apache Pig UDF.



Η σημερινή ανάρτηση αφορά τις λειτουργίες φόρτωσης στο Apache Pig. Αυτή είναι η συνέχεια του πρώτη ανάρτηση που κάλυψε τις λειτουργίες UDF όπως Eval, Filter και Aggregate. Ανατρέξτε σε αυτές για περισσότερες πληροφορίες σχετικά με άλλες λειτουργίες του Pig UDF.



Η λειτουργία φόρτωσης του χοίρου είναι χτισμένη πάνω από το InputFormat ενός Hadoop, την κλάση που χρησιμοποιεί το Hadoop για την ανάγνωση δεδομένων. Το InputFormat έχει δύο σκοπούς: Προσδιορίζει πώς η εισαγωγή θα κατακερματιστεί μεταξύ των εργασιών χαρτών και παρέχει ένα RecordReader που οδηγεί σε ζεύγη τιμών-κλειδιών ως είσοδο σε αυτές τις εργασίες χαρτών. Η βασική κλάση για τη λειτουργία φόρτωσης είναι LoadFunc.

μάθηση ssis βήμα προς βήμα

Λειτουργία φόρτωσης - Ταξινόμηση:

Η αφηρημένη κλάση LoadFunc έχει τρεις κύριες μεθόδους για τη φόρτωση δεδομένων και στις περισσότερες περιπτώσεις χρήσης αρκεί να επεκταθεί. Υπάρχουν τρεις άλλες προαιρετικές διεπαφές που μπορούν να εφαρμοστούν για την επίτευξη εκτεταμένης λειτουργικότητας:



  • LoadMetadata:

Το LoadMetadata έχει μεθόδους αντιμετώπισης μεταδεδομένων. Οι περισσότερες εκτελέσεις των φορτωτών δεν χρειάζεται να το εφαρμόσουν εκτός εάν αλληλεπιδρούν με ένα σύστημα μεταδεδομένων. Η μέθοδος getSchema () σε αυτήν τη διεπαφή προσφέρει έναν τρόπο για τις εφαρμογές του φορτωτή να επικοινωνούν σχετικά με το σχήμα των δεδομένων πίσω στο Pig. Εάν μια εφαρμογή φόρτωσης επιστρέφει δεδομένα που αποτελούνται από πεδία πραγματικών τύπων, θα πρέπει να παρέχει το σχήμα που περιγράφει τα δεδομένα που επιστρέφονται μέσω της μεθόδου getSchema (). Οι άλλες μέθοδοι ασχολούνται με άλλους τύπους μεταδεδομένων, όπως κλειδιά διαμερισμάτων και στατιστικά στοιχεία. Οι υλοποιήσεις μπορούν να επιστρέψουν τιμές μηδενικής επιστροφής για αυτές τις μεθόδους εάν δεν είναι έγκυρες για την άλλη υλοποίηση.

  • LoadPushDown:

Το LoadPushDown έχει διαφορετικές μεθόδους για να ωθήσει τις λειτουργίες από το χρόνο εκτέλεσης του χοίρου σε εφαρμογές φορτωτή. Προς το παρόν, μόνο η μέθοδος pushProjection () καλείται από το Pig για να επικοινωνήσει με τον φορτωτή, τα ακριβή πεδία που απαιτούνται στο σενάριο Pig. Η εφαρμογή φόρτωσης μπορεί να επιλέξει να συμμορφωθεί ή να μην ακολουθήσει το αίτημα. Εάν η εφαρμογή του φορτωτή αποφασίσει να ανταποκριθεί στο αίτημα, θα πρέπει να εφαρμόσει το LoadPushDown για να βελτιώσει την απόδοση του ερωτήματος.

  • pushProjection ():

Αυτή η μέθοδος ενημερώνει το LoadFunc, ποια πεδία απαιτούνται στο σενάριο Pig. Επιτρέποντας έτσι στο LoadFunc να βελτιώσει την απόδοση φορτώνοντας μόνο τα πεδία που απαιτούνται. Το pushProjection () παίρνει ένα «απαιτείταιFieldList». Το «απαιτείταιFieldList» είναι μόνο για ανάγνωση και δεν μπορεί να αλλάξει από το LoadFunc. Το «απαιτείταιFieldList» περιλαμβάνει μια λίστα «απαιτείταιField», όπου κάθε «απαιτείταιField» υποδεικνύει ένα πεδίο που απαιτείται από το σενάριο Pig και αποτελείται από ευρετήριο, ψευδώνυμο, τύπο και subFields. Το Pig χρησιμοποιεί το ευρετήριο στηλών που απαιτείταιField.index για να επικοινωνήσει με το LoadFunc σχετικά με τα πεδία που απαιτούνται από το σενάριο Pig. Εάν το απαιτούμενο πεδίο είναι ένας χάρτης, ο Χοίρος θα περάσει το «απαιτείταιField.subFields» που περιέχει μια λίστα κλειδιών που απαιτούνται από τα σενάρια χοίρων για το χάρτη.



  • LoadCaster:

Το LoadCaster έχει τεχνικές μετατροπής συστοιχιών byte σε συγκεκριμένους τύπους. Μια εφαρμογή φόρτωσης θα πρέπει να το εφαρμόσει όταν πρέπει να υποστηρίζεται σιωπηρή ή ρητή μετάδοση από τα πεδία DataByteArray σε άλλους τύπους.

Η αφηρημένη κλάση LoadFunc είναι η κύρια κλάση που επεκτείνεται για την εφαρμογή ενός φορτωτή. Οι μέθοδοι που απαιτείται να παρακαμφθούν εξηγούνται παρακάτω:

  • getInputFormat ():

    Αυτή η μέθοδος καλείται από το Pig για να χρησιμοποιήσει το InputFormat από τον φορτωτή. Οι μέθοδοι στο InputFormat καλούνται από το Pig με τον ίδιο τρόπο όπως το Hadoop σε ένα πρόγραμμα MapReduce Java. Εάν το InputFormat είναι ένα πακέτο Hadoop, η υλοποίηση θα πρέπει να χρησιμοποιεί το νέο API που βασίζεται στο, στο org.apache.hadoop.mapreduce. Εάν είναι προσαρμοσμένο InputFormat, είναι καλύτερα να εφαρμοστεί χρησιμοποιώντας το νέο API στο org.apache.hadoop.mapreduce.

  • setLocation ():

    Αυτή η μέθοδος καλείται από το Pig για να κοινοποιήσει τη θέση φόρτωσης στον φορτωτή. Ο φορτωτής πρέπει να χρησιμοποιήσει αυτήν τη μέθοδο για να κοινοποιήσει τις ίδιες πληροφορίες στον πυρήνα InputFormat. Αυτή η μέθοδος καλείται πολλές φορές από χοίρο.

  • προετοιμασίαToRead ():

    Σε αυτήν τη μέθοδο, το RecordReader που σχετίζεται με το InputFormat που παρέχεται από το LoadFunc μεταφέρεται στο LoadFunc. Το RecordReader μπορεί τώρα να χρησιμοποιηθεί από την εφαρμογή στο getNext () για να επιστρέψει μια πλειάδα που αντιπροσωπεύει μια εγγραφή δεδομένων πίσω στο Pig.

  • getNext ():

    Η έννοια του getNext () δεν έχει αλλάξει και καλείται από το Pig runtime για να αποκτήσει την επόμενη πλειάδα στα δεδομένα. Σε αυτήν τη μέθοδο, η εφαρμογή θα πρέπει να χρησιμοποιεί το υποκείμενο RecordReader και να κατασκευάζει την πλειάδα για επιστροφή.

Προεπιλεγμένες υλοποιήσεις στο LoadFunc:

Λάβετε υπόψη ότι οι προεπιλεγμένες εφαρμογές στο LoadFunc θα πρέπει να παρακαμφθούν μόνο όταν χρειάζεται.

ec2 δημιουργία παρουσίας από στιγμιότυπο
  • setUdfContextSignature ():

    Αυτή η μέθοδος θα καλείται από το Pig, τόσο στο μπροστινό όσο και στο πίσω άκρο για να περάσει μια μοναδική υπογραφή στο Loader. Η υπογραφή μπορεί να χρησιμοποιηθεί για την αποθήκευση οποιωνδήποτε πληροφοριών στο UDFContext που χρειάζεται ο Φορτωτής να αποθηκεύσει μεταξύ διαφόρων μεθόδων επίκλησης στο μπροστινό και στο πίσω μέρος. Μια περίπτωση χρήσης είναι να αποθηκεύσετε το RequiredFieldList που έχει περάσει σε αυτό στο LoadPushDown.pushProjection (RequiredFieldList) για χρήση στο πίσω μέρος πριν επιστρέψετε πλειάδες στο getNext (). Η προεπιλεγμένη εφαρμογή στο LoadFunc έχει ένα κενό σώμα. Αυτή η μέθοδος θα καλείται πριν από άλλες μεθόδους.

  • relatifToAbsolutePath ():

    Ο χρόνος εκτέλεσης των χοίρων θα καλέσει αυτήν τη μέθοδο για να επιτρέψει στο Loader να μετατρέψει μια σχετική θέση φόρτωσης σε απόλυτη θέση. Η προεπιλεγμένη εφαρμογή που παρέχεται στο LoadFunc το χειρίζεται για τοποθεσίες FileSystem. Εάν η πηγή φόρτωσης είναι κάτι διαφορετικό, η εφαρμογή φόρτωσης μπορεί να επιλέξει να το παρακάμψει.

Η εφαρμογή φόρτωσης στο παράδειγμα είναι ένας φορτωτής για δεδομένα κειμένου με οριοθέτη γραμμής ως «
'Και' 'ως προεπιλεγμένο διαχωριστικό πεδίου παρόμοιο με το τρέχον φορτωτή PigStorage στο Pig. Η υλοποίηση χρησιμοποιεί μια υπάρχουσα υποστηριζόμενη Hadoop Inputformat - TextInputFormat - ως την υποκείμενη InputFormat.

δημόσια τάξη SimpleTextLoader επεκτείνει το LoadFunc {protected RecordReader in = null private byte fieldDel = 'private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader Pig loader που χρησιμοποιεί καθορισμένο χαρακτήρα ως διαχωριστικό πεδίου. * * @param delimiter * ο χαρακτήρας ενός byte που χρησιμοποιείται για το διαχωρισμό πεδίων. * ('' είναι η προεπιλογή.) * / public SimpleTextLoader (String delimiter) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} αλλιώς εάν ( 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 () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: ρίξτε νέο RuntimeException ('Unknown delimiter' + delimiter)}} άλλο {ρίξτε νέο RuntimeException ('PigStorage delimeter πρέπει να είναι ένας χαρακτήρας')}} @Override public Tuple getNext () ρίχνει το IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} Value text = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 για (int i = 0 iΈχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων και θα επικοινωνήσουμε μαζί σας. 

Σχετικές αναρτήσεις: