Παραδείγματα ερωτημάτων κυψέλης: Ταξινόμηση κατά, Ομαδοποίηση κατά & Cluster By

⚡ Έξυπνη Σύνοψη

Τα ερωτήματα Hive χρησιμοποιούν τους όρους ORDER BY, GROUP BY, SORT BY, CLUSTER BY και DISTRIBUTE BY για την ταξινόμηση, την ομαδοποίηση και την κατανομή γραμμών σε μειωτήρες και κάθε όρος παρουσιάζεται εδώ σε έναν μόνο πίνακα δείγματος υπαλλήλων.

  • 🧱 Πρώτο δείγμα πίνακα: Το employees_guru δημιουργείται με έξι στήλες και φορτώνεται από το Employees.txt πριν από την εκτέλεση οποιασδήποτε ρήτρας.
  • 🔢 ΤΑΞΙΝΟΜΗΣΗ ΜΕ βάση σύνολα: Η συνάρτηση ORDER BY στέλνει ολόκληρο το σύνολο αποτελεσμάτων σε έναν μειωτή, ο οποίος εγγυάται την πλήρη σειρά αλλά επιβραδύνει τα μεγάλα ερωτήματα.
  • 🔤 Ταξινόμηση συμβολοσειρών: Μια στήλη συμβολοσειράς όπως το Τμήμα επιστρέφεται με λεξικογραφική σειρά και όχι με αριθμητική σειρά.
  • 📊 ΟΜΑΔΟΠΟΙΗΣΗ ΜΕ βάση: Η αντιστοίχιση της συνάρτησης GROUP BY με την συνάρτηση count(*) επιστρέφει μία γραμμή ανά τμήμα με το σύνολο των υπαλλήλων του.
  • 🔀 Η ταξινόμηση κατά είναι ανά μειωτήρα: Η εντολή SORT BY ταξινομεί τις γραμμές μέσα σε κάθε μειωτή, έτσι ώστε πολλαπλοί μειωτές να παράγουν μερικώς ταξινομημένο αποτέλεσμα.
  • 🎯 Το CLUSTER BY συνδυάζει: Η συνάρτηση CLUSTER BY λειτουργεί ως DISTRIBUTE BY συν SORT BY, ενώ η συνάρτηση DISTRIBUTE BY από μόνη της δρομολογεί τα αντίστοιχα κλειδιά σε έναν μειωτή χωρίς ταξινόμηση.

Ερωτήματα κυψέλης Ταξινόμηση κατά, Ομαδοποίηση κατά, Cluster Από και Διανομή από

Το Hive παρέχει μια γλώσσα ερωτημάτων τύπου SQL για σκοπούς ETL επιπλέον του Hadoop σύστημα αρχείων.

Η γλώσσα ερωτημάτων Hive (HiveQL) παρέχει ένα περιβάλλον τύπου SQL στο Hive για εργασία με πίνακες, βάσεις δεδομένων και ερωτήματα.

Διαφορετικοί τύποι ρητρών σχετίζονται με το Hive για την εκτέλεση διαφορετικών τύπων χειρισμού δεδομένων και ερωτημάτων, και το Hive παρέχει συνδεσιμότητα JDBC για καλύτερες συνδέσεις με κόμβους εκτός του περιβάλλοντος.

Τα ερωτήματα Hive παρέχουν τις ακόλουθες δυνατότητες:

  • Μοντελοποίηση δεδομένων όπως δημιουργία βάσεων δεδομένων, πινάκων κ.λπ.
  • Λειτουργίες ETL όπως π.χ.tracμετατροπή, μετασχηματισμός και φόρτωση δεδομένων σε πίνακες
  • Ενώνει για τη συγχώνευση διαφορετικών πινάκων δεδομένων
  • Ειδικά προσαρμοσμένα σενάρια χρήστη για ευκολία στον κώδικα
  • Ταχύτερο εργαλείο αναζήτησης πάνω από το Hadoop

Δημιουργία πίνακα στο Hive

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

Σε αυτό το σεμινάριο, θα δημιουργήσουμε τον πίνακα "employees_guru" με 6 στήλες, όπως φαίνεται στο παρακάτω στιγμιότυπο οθόνης.

Η πρόταση Hive CREATE TABLE για το employees_guru και την εντολή load

Από το παραπάνω στιγμιότυπο οθόνης,

  1. Δημιουργούμε τον πίνακα "employees_guru" με 6 τιμές στηλών όπως Id, Name, Age, Address, Salary, Department, οι οποίες ανήκουν στους υπαλλήλους που υπάρχουν στον οργανισμό "guru".
  2. Σε αυτό το βήμα, φορτώνουμε δεδομένα στον πίνακα employees_guru. Τα δεδομένα που πρόκειται να φορτώσουμε τοποθετούνται στο αρχείο Employees.txt.

Παραγγελία με ερώτημα

Η σύνταξη ORDER BY στο HiveQL είναι παρόμοια με τη σύνταξη του ORDER BY στο SQL Γλώσσα.

Η ORDER BY είναι η πρόταση που χρησιμοποιούμε με την πρόταση "SELECT" στο Ερωτήματα κυψέλης για την ταξινόμηση δεδομένων. Χρησιμοποιεί στήλες σε πίνακες Hive για την ταξινόμηση των συγκεκριμένων τιμών στηλών που αναφέρονται με ORDER BY και το ερώτημα εμφανίζει τα αποτελέσματα σε αύξουσα ή φθίνουσα σειρά αυτών των τιμών.

Εάν το αναφερόμενο πεδίο ORDER BY είναι μια συμβολοσειρά, τότε εμφανίζει το αποτέλεσμα με λεξικογραφική σειρά. Στο παρασκήνιο, ολόκληρο το σύνολο αποτελεσμάτων πρέπει να διαβιβαστεί σε έναν μόνο μειωτή.

Αυτός ο μοναδικός μειωτής καθιστά επίσης την ORDER BY ακριβή σε ένα μεγάλο τραπέζι, επομένως σε αυστηρή λειτουργία (hive.mapred.mode=strict) Το Hive απορρίπτει μια εντολή ORDER BY που δεν περιέχει ρήτρα LIMIT.

Το παρακάτω στιγμιότυπο οθόνης δείχνει το ερώτημα ORDER BY και τις ταξινομημένες γραμμές του.

ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ ερώτημα στο employees_guru ταξινομημένο ανά Τμήμα

Από το παραπάνω στιγμιότυπο οθόνης, μπορούμε να παρατηρήσουμε τα εξής:

  1. Είναι το ερώτημα που εκτελείται στον πίνακα "employees_guru" με τον όρο ORDER BY και το Department ως το καθορισμένο όνομα στήλης ORDER BY. Το "Department" είναι μια συμβολοσειρά, επομένως εμφανίζει αποτελέσματα με βάση τη λεξικογραφική σειρά.
  2. Αυτή είναι η πραγματική έξοδος για το ερώτημα. Τα αποτελέσματα εμφανίζονται με βάση τη στήλη Τμήμα, όπως ΔΙΟΙΚΗΣΗ, Οικονομικά και ούτω καθεξής, με τη σειρά.

Ερώτηση:

SELECT * FROM employees_guru ORDER BY Department;

Ομαδοποίηση ανά ερώτημα

Η ρήτρα GROUP BY χρησιμοποιεί στήλες σε πίνακες Hive για ομαδοποίηση.ping τις συγκεκριμένες τιμές στήλης που αναφέρονται με την εντολή GROUP BY και το ερώτημα επιλέγει και εμφανίζει τα αποτελέσματα ομαδοποιημένα με βάση αυτές τις τιμές.

Για παράδειγμα, το παρακάτω στιγμιότυπο οθόνης εμφανίζει τον συνολικό αριθμό υπαλλήλων που υπάρχουν σε κάθε τμήμα. Εδώ έχουμε την τιμή "Τμήμα" ως GROUP BY.

Ερώτημα GROUP BY που μετράει τους υπαλλήλους σε κάθε τμήμα

Από το παραπάνω στιγμιότυπο οθόνης, θα παρατηρήσουμε τα εξής:

  1. Είναι το ερώτημα που εκτελείται στον πίνακα "employees_guru" με τον όρο GROUP BY και το Department ως το καθορισμένο όνομα στήλης GROUP BY.
  2. Το αποτέλεσμα που εμφανίζεται εδώ είναι το όνομα του τμήματος και ο αριθμός των υπαλλήλων στα διάφορα τμήματα. Όλοι οι υπάλληλοι που ανήκουν σε ένα συγκεκριμένο τμήμα ομαδοποιούνται και εμφανίζονται, επομένως κάθε σειρά αποτελεσμάτων είναι ένα όνομα τμήματος με τον συνολικό αριθμό υπαλλήλων του.

Ερώτηση:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

Ταξινόμηση κατά

Η ρήτρα SORT BY εκτελείται σε ονόματα στηλών πινάκων Hive για να ταξινομήσει την έξοδο. Μπορούμε να αναφέρουμε την DESC για ταξινόμηση κατά φθίνουσα σειρά και την ASC για αύξουσα σειρά ταξινόμησης.

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

Για παράδειγμα, εάν ο τύπος στήλης είναι αριθμητικός, η ταξινόμηση γίνεται με αριθμητική σειρά, ενώ εάν ο τύπος στήλης είναι συμβολοσειρά, η ταξινόμηση γίνεται με λεξικογραφική σειρά.

Το παρακάτω στιγμιότυπο οθόνης δείχνει το ερώτημα SORT BY χρησιμοποιώντας τη συνάρτηση DESC.

Το ερώτημα SORT BY στο employees_guru επιστρέφει το Id σε φθίνουσα σειρά

Από το παραπάνω στιγμιότυπο οθόνης μπορούμε να παρατηρήσουμε τα εξής:

  1. Είναι το ερώτημα που εκτελείται στον πίνακα "employees_guru" με τον όρο SORT BY και το "Id" ως το καθορισμένο όνομα στήλης SORT BY. Χρησιμοποιήσαμε τη λέξη-κλειδί DESC.
  2. Έτσι, η έξοδος που εμφανίζεται είναι κατά φθίνουσα σειρά του "Id".

Ερώτηση:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

Η συνάρτηση CLUSTER BY χρησιμοποιείται ως εναλλακτική λύση και για τις δύο ρήτρες DISTRIBUTE BY και SORT BY στο HiveQL.

Η ρήτρα CLUSTER BY χρησιμοποιείται σε πίνακες που υπάρχουν στο Hive. Το Hive χρησιμοποιεί τις στήλες στο CLUSTER BY για να κατανείμει τις γραμμές μεταξύ των μειωτήρων και οι στήλες CLUSTER BY πηγαίνουν σε πολλαπλούς μειωτήρες. Επίσης, διασφαλίζει τη σειρά ταξινόμησης των τιμών που υπάρχουν σε αυτούς τους πολλαπλούς μειωτήρες.

Για παράδειγμα, η ρήτρα CLUSTER BY αναφέρεται στο όνομα της στήλης Id του πίνακα employees_guru. Η εκτέλεση αυτού του ερωτήματος δίνει αποτελέσματα σε πολλαπλούς μειωτές στο παρασκήνιο, αλλά στο μπροστινό μέρος είναι μια εναλλακτική ρήτρα τόσο για την SORT BY όσο και για την DISTRIBUTE BY.

Αυτή είναι η διαδικασία back-end όταν εκτελούμε ένα ερώτημα με SORT BY, GROUP BY ή CLUSTER BY στο πλαίσιο MapReduce. Έτσι, αν θέλουμε να αποθηκεύσουμε τα αποτελέσματα σε πολλαπλούς μειωτήρες, επιλέγουμε CLUSTER BY.

Η γραμματική CLUSTER BY δέχεται μόνο ονόματα στηλών, επομένως οι ASC και DESC δεν μπορούν να προστεθούν σε αυτήν. Ένα φθίνον αποτέλεσμα χρειάζεται DISTRIBUTE BY με ξεχωριστό SORT BY … DESC.

Το παρακάτω στιγμιότυπο οθόνης δείχνει το ερώτημα CLUSTER BY στο Id.

Ερώτημα CLUSTER BY στη στήλη Id του employees_guru

Από το παραπάνω στιγμιότυπο οθόνης λαμβάνουμε τις ακόλουθες παρατηρήσεις:

  1. Είναι το ερώτημα που εκτελεί τον όρο CLUSTER BY στην τιμή του πεδίου Id. Εδώ θα γίνει ταξινόμηση στις τιμές Id.
  2. Εμφανίζει τις τιμές Id και Name που υπάρχουν στο employees_guru με ταξινομημένη σειρά.

Ερώτηση:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Διανομή κατά

Η ρήτρα DISTRIBUTE BY χρησιμοποιείται σε πίνακες που υπάρχουν στο Hive. Το Hive χρησιμοποιεί τις στήλες στο DISTRIBUTE BY για να κατανείμει τις γραμμές μεταξύ των reducers, έτσι ώστε όλες οι γραμμές που μοιράζονται την ίδια τιμή στήλης DISTRIBUTE BY να πηγαίνουν στον ίδιο reducer.

  • Εξασφαλίζει ότι κάθε ένας από τους μειωτήρες Ν δεν λαμβάνει επικάλυψηping σύνολο τιμών στήλης
  • Δεν ταξινομεί την έξοδο κάθε μειωτήρα και δεν είναι εγγυημένο ότι οι αντίστοιχες γραμμές θα βρίσκονται η μία δίπλα στην άλλη.

Το παρακάτω στιγμιότυπο οθόνης δείχνει το ερώτημα DISTRIBUTE BY στο Id.

Ερώτημα DISTRIBUTE BY στη στήλη Id του employees_guru

Από το παραπάνω στιγμιότυπο οθόνης, μπορούμε να παρατηρήσουμε τα εξής:

  1. Η ρήτρα DISTRIBUTE BY εκτελείται στο Id του πίνακα "employees_guru".
  2. Η έξοδος εμφανίζει το Id και το Όνομα. Στο παρασκήνιο, οι γραμμές με το ίδιο Id πηγαίνουν στον ίδιο μειωτήρα.

Ερώτηση:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Οι τέσσερις προτάσεις είναι εύκολο να συγχέονται, επομένως ο παρακάτω πίνακας τις συγκρίνει.

Ρήτρα Μειωτές Τι εγγυάται
ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ Ένας Συνολική σειρά σε ολόκληρο το αποτέλεσμα
ΣΥΝΤΟΜΟΠΟΙΗΣΤΕ ΑΠΟ Πολλές Παραγγελία μόνο εντός κάθε μειωτήρα
ΔΙΑΝΕΜΕΤΑΙ ΑΠΟ Πολλές Το ίδιο κλειδί φτάνει στον ίδιο μειωτήρα, χωρίς ταξινόμηση
ΟΜΑΔΟΠΟΙΗΣΗ ΜΕ Πολλές ΚΑΤΑΝΟΜΗ ΚΑΤΑ συν ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ, αύξουσα

Συχνές Ερωτήσεις

Ένας μόνο μειωτής πρέπει να ταξινομεί κάθε γραμμή, κάτι που μπορεί να εκτελείται για ώρες σε έναν μεγάλο πίνακα. Όρια LIMIT που λειτουργούν. Η ρύθμιση του hive.mapred.mode σε nonstrict καταργεί εντελώς τον περιορισμό.

Ορίστε την mapreduce.job.reduces πριν από το ερώτημα για να διορθώσετε την καταμέτρηση, διαφορετικά η Hive την εκτιμά από το μέγεθος εισόδου. Η ORDER BY αγνοεί τη ρύθμιση, επειδή μια συνολική παραγγελία πάντα συμπτύσσεται σε έναν μειωτή.

Όχι. Η ρήτρα δέχεται μόνο ονόματα στηλών και ταξινομεί πάντα αύξουσα. Γράψτε DISTRIBUTE BY στη στήλη διαμέρισης με ξεχωριστή στήλη SORT BY DESC. Οι δύο στήλες ενδέχεται επίσης να διαφέρουν.

Είναι σχετικά αλλά όχι ταυτόσημα. Κάδος Αποθηκεύει γραμμές μόνιμα σε έναν σταθερό αριθμό αρχείων, ενώ η συνάρτηση CLUSTER BY κατανέμει και ταξινομεί γραμμές μόνο για τη διάρκεια ενός ερωτήματος.

Οι βοηθοί μηχανικής μάθησης διαβάζουν το σχέδιο EXPLAIN και επισημαίνουν αιτίες όπως μια απεριόριστη ORDER BY, ένα φίλτρο διαμερίσματος που λείπει ή ένα ασύμμετρο κλειδί. Επιβεβαιώστε κάθε πρόταση σε σχέση με τον πραγματικό χρόνο εκτέλεσης.

Σχεδιάζει αυτά τα μοτίβα καλά από ένα σύντομο σχόλιο. Επαληθεύστε οτιδήποτε αφορά τη μηχανή, επειδή ενσωματώνεται εύκολα. Spark Σύνταξη SQL ή Presto που απορρίπτει το Hive, όπως το DESC μετά το CLUSTER BY.

Ένα αρχείο απλού κειμένου με το όνομα Employees.txt περιέχει τις τιμές των έξι στηλών και φορτώνεται στον πίνακα πριν από την εκτέλεση του πρώτου ερωτήματος. Οποιοδήποτε οριοθετημένο αρχείο με αντίστοιχες στήλες λειτουργεί με τον ίδιο τρόπο.

Η σημασιολογία είναι πανομοιότυπη, επειδή πρόκειται για χαρακτηριστικά της γλώσσας HiveQL και όχι για χαρακτηριστικά της μηχανής. Μόνο το φυσικό σχέδιο αλλάζει — οι μηχανές προγραμματίζουν τα στάδια ταξινόμησης και τυχαίας αναπαραγωγής διαφορετικά, επομένως οι χρόνοι εκτέλεσης ποικίλλουν, ενώ τα αποτελέσματα όχι.

Συνοψίστε αυτήν την ανάρτηση με: