Hive Join & SubQuery Tutorial με παραδείγματα
Ενώστε ερωτήματα
Τα ερωτήματα σύνδεσης μπορούν να εκτελεστούν σε δύο πίνακες που υπάρχουν στο Hive. Για κατανόηση Εγγραφείτε Concepts καθαρά εδώ δημιουργούμε δύο πίνακες από εδώ,
- Sample_joins (Σχετικά με τα στοιχεία πελατών)
- Sample_joins1 (Σχετίζεται με λεπτομέρειες παραγγελιών από Υπαλλήλους)
Βήμα 1) Δημιουργία πίνακα «sample_joins» με ονόματα στηλών ID, Όνομα, Ηλικία, διεύθυνση και μισθός των εργαζομένων
Βήμα 2) Φόρτωση και εμφάνιση δεδομένων
Από το παραπάνω στιγμιότυπο οθόνης
- Φόρτωση δεδομένων σε sample_joins από Customers.txt
- Εμφάνιση περιεχομένων πίνακα sample_joins
Βήμα 3) Δημιουργία πίνακα sample_joins1 και φόρτωση, εμφάνιση δεδομένων
Από το παραπάνω στιγμιότυπο οθόνης, μπορούμε να παρατηρήσουμε τα εξής
- Δημιουργία πίνακα sample_joins1 με στήλες Orderid, Date1, Id, Amount
- Φόρτωση δεδομένων στο sample_joins1 από το orders.txt
- Εμφάνιση εγγραφών που υπάρχουν στο sample_joins1
Προχωρώντας προς τα εμπρός, θα δούμε διαφορετικούς τύπους συνδέσεων που μπορούν να εκτελεστούν σε πίνακες που έχουμε δημιουργήσει, αλλά πριν από αυτό θα πρέπει να εξετάσετε τα ακόλουθα σημεία για τις ενώσεις.
Μερικά σημεία που πρέπει να προσέξετε στο Joins:
- Μόνο οι ενώσεις ισότητας επιτρέπονται στις εγγραφές
- Στο ίδιο ερώτημα μπορούν να ενωθούν περισσότεροι από δύο πίνακες
- ΑΡΙΣΤΕΡΑ, ΔΕΞΙΑ, ΠΛΗΡΕΣ ΕΞΩΤΕΡΙΚΗ υπάρχουν ενώσεις για να παρέχεται περισσότερος έλεγχος στη ρήτρα ON για την οποία δεν υπάρχει αντιστοίχιση
- Οι ενώσεις δεν είναι αντικαταστατικές
- Οι συνδέσεις είναι αριστερές συνειρμικές, ανεξάρτητα από το αν είναι ΑΡΙΣΤΕΡΕΣ ή ΔΕΞΙΕΣ ενώσεις
Διαφορετικοί τύποι ενώσεων
Οι ενώσεις είναι 4 τύπων, αυτοί είναι
- Εσωτερική σύνδεση
- Αριστερή εξωτερική σύνδεση
- Δεξιά εξωτερική συμμετοχή
- Πλήρης εξωτερική συμμετοχή
Εσωτερική σύνδεση:
Οι εγγραφές που είναι κοινές και στους δύο πίνακες θα ανακτηθούν από αυτήν την εσωτερική ένωση.
Από το παραπάνω στιγμιότυπο οθόνης, μπορούμε να παρατηρήσουμε τα εξής
- Εδώ εκτελούμε το ερώτημα σύνδεσης χρησιμοποιώντας τη λέξη-κλειδί JOIN μεταξύ των πινάκων sample_joins και sample_joins1 με συνθήκη αντιστοίχισης ως (c.Id= o.Id).
- Η έξοδος εμφανίζει κοινές εγγραφές που υπάρχουν και στους δύο πίνακα, ελέγχοντας τη συνθήκη που αναφέρεται στο ερώτημα
Ερώτηση:
SELECT c.Id, c.Name, c.Age, o.Amount FROM sample_joins c JOIN sample_joins1 o ON(c.Id=o.Id);
Αριστερή εξωτερική ένωση:
- Γλώσσα ερωτήματος Hive Το LEFT OUTER JOIN επιστρέφει όλες τις σειρές από τον αριστερό πίνακα, παρόλο που δεν υπάρχουν αντιστοιχίσεις στον δεξιό πίνακα
- Εάν η ρήτρα ON ταιριάζει με μηδέν εγγραφές στον δεξιό πίνακα, οι συνδέσεις εξακολουθούν να επιστρέφουν μια εγγραφή στο αποτέλεσμα με NULL σε κάθε στήλη από τον δεξιό πίνακα
Από το παραπάνω στιγμιότυπο οθόνης, μπορούμε να παρατηρήσουμε τα εξής
- Εδώ εκτελούμε ερώτημα σύνδεσης χρησιμοποιώντας τη λέξη-κλειδί «ΑΡΙΣΤΕΡΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ» μεταξύ των πινάκων sample_joins και sample_joins1 με συνθήκη αντιστοίχισης ως (c.Id= o.Id).Για παράδειγμα Εδώ χρησιμοποιούμε το αναγνωριστικό υπαλλήλου ως αναφορά, ελέγχει αν το αναγνωριστικό είναι κοινό στον πίνακα δεξιά και αριστερά ή όχι. Λειτουργεί ως συνθήκη ταιριάσματος.
- Η έξοδος που εμφανίζει κοινές εγγραφές που υπάρχουν και στους δύο πίνακα ελέγχοντας τη συνθήκη που αναφέρεται στο ερώτημα. Οι τιμές NULL στην παραπάνω έξοδο είναι στήλες χωρίς τιμές από τον πίνακα Right που είναι sample_joins1
Ερώτηση:
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c LEFT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
Δεξιά εξωτερική ένωση:
- Γλώσσα ερωτήματος Hive RIGHT OUTER JOIN επιστρέφει όλες τις σειρές από τον πίνακα Δεξιά παρόλο που δεν υπάρχουν αντιστοιχίσεις στον αριστερό πίνακα
- Εάν η ρήτρα ON ταιριάζει με μηδέν εγγραφές στον αριστερό πίνακα, οι συνδέσεις εξακολουθούν να επιστρέφουν μια εγγραφή στο αποτέλεσμα με NULL σε κάθε στήλη από τον αριστερό πίνακα
- Οι ενώσεις RIGHT επιστρέφουν πάντα εγγραφές από έναν δεξιό πίνακα και αντιστοιχισμένες εγγραφές από τον αριστερό πίνακα. Εάν ο αριστερός πίνακας δεν έχει τιμές που να αντιστοιχούν στη στήλη, θα επιστρέψει τιμές NULL σε αυτό το μέρος.
Από το παραπάνω στιγμιότυπο οθόνης, μπορούμε να παρατηρήσουμε τα εξής
- Εδώ εκτελούμε ερώτημα σύνδεσης χρησιμοποιώντας τη λέξη-κλειδί «ΔΕΞΙΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ» μεταξύ των πινάκων sample_joins και sample_joins1 με συνθήκη αντιστοίχισης ως (c.Id= o.Id).
- Η έξοδος εμφανίζει κοινές εγγραφές που υπάρχουν και στους δύο πίνακα, ελέγχοντας τη συνθήκη που αναφέρεται στο ερώτημα
Απορία:
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c RIGHT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
Πλήρης εξωτερική ένωση:
Συνδυάζει εγγραφές και των δύο πινάκων sample_joins και sample_joins1 με βάση την συνθήκη JOIN που δίνεται στο ερώτημα.
Επιστρέφει όλες τις εγγραφές και από τους δύο πίνακες και συμπληρώνει NULL τιμές για τις στήλες που λείπουν οι τιμές που ταιριάζουν και στις δύο πλευρές.
Από το παραπάνω στιγμιότυπο οθόνης μπορούμε να παρατηρήσουμε τα εξής:
- Εδώ εκτελούμε ερώτημα σύνδεσης χρησιμοποιώντας τη λέξη-κλειδί «ΠΛΗΡΗΣ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ» μεταξύ των πινάκων sample_joins και sample_joins1 με συνθήκη αντιστοίχισης ως (c.Id= o.Id).
- Η έξοδος εμφανίζει όλες τις εγγραφές που υπάρχουν και στους δύο πίνακα ελέγχοντας την κατάσταση που αναφέρεται στο ερώτημα. Οι μηδενικές τιμές στην έξοδο εδώ υποδεικνύουν τις τιμές που λείπουν από τις στήλες και των δύο πινάκων.
Απορία
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c FULL OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
Υποερωτήματα
Ένα ερώτημα που υπάρχει σε ένα ερώτημα είναι γνωστό ως δευτερεύον ερώτημα. Το κύριο ερώτημα θα εξαρτηθεί από τις τιμές που επιστρέφονται από τα υποερωτήματα.
Τα δευτερεύοντα ερωτήματα μπορούν να ταξινομηθούν σε δύο τύπους
- Υποερωτήματα στην ρήτρα FROM
- Υποερωτήματα στην ρήτρα WHERE
Πότε πρέπει να χρησιμοποιήσετε:
- Για να λάβετε μια συγκεκριμένη τιμή συνδυασμένη από δύο τιμές στηλών από διαφορετικούς πίνακες
- Εξάρτηση τιμών ενός πίνακα από άλλους πίνακες
- Συγκριτικός έλεγχος τιμών μιας στήλης από άλλους πίνακες
Σύνταξη:
Subquery in FROM clause SELECT <column names 1, 2…n>From (SubQuery) <TableName_Main > Subquery in WHERE clause SELECT <column names 1, 2…n> From<TableName_Main>WHERE col1 IN (SubQuery);
Παράδειγμα:
SELECT col1 FROM (SELECT a+b AS col1 FROM t1) t2
Εδώ τα t1 και t2 είναι ονόματα πινάκων. Το έγχρωμο είναι το Subquery που εκτελείται στον πίνακα t1. Εδώ τα a και b είναι στήλες που προστίθενται σε ένα υποερώτημα και εκχωρούνται στο col1. Col1 είναι η τιμή στήλης που υπάρχει στον Κύριο πίνακα. Αυτή η στήλη "col1" που υπάρχει στο υποερώτημα είναι ισοδύναμη με το ερώτημα του κύριου πίνακα στη στήλη col1.
Ενσωμάτωση προσαρμοσμένων σεναρίων
Κυψέλη παρέχει τη δυνατότητα σύνταξης συγκεκριμένων σεναρίων χρήστη για τις απαιτήσεις του πελάτη. Οι χρήστες μπορούν να γράψουν τον δικό τους χάρτη και να μειώσουν τα σενάρια για τις απαιτήσεις. Αυτά ονομάζονται ενσωματωμένα προσαρμοσμένα σενάρια. Η λογική κωδικοποίησης ορίζεται στα προσαρμοσμένα σενάρια και μπορούμε να χρησιμοποιήσουμε αυτό το σενάριο στο χρόνο ETL.
Πότε να επιλέξετε Ενσωματωμένα σενάρια:
- Σε συγκεκριμένες απαιτήσεις πελάτη, οι προγραμματιστές πρέπει να γράφουν και να αναπτύσσουν σενάρια στο Hive
- Όπου οι ενσωματωμένες λειτουργίες Hive δεν πρόκειται να λειτουργήσουν για συγκεκριμένες απαιτήσεις τομέα
Για αυτό στο Hive χρησιμοποιεί την ρήτρα TRANSFORM για να ενσωματώσει σενάρια χαρτών και μειωτήρα.
Σε αυτά τα ενσωματωμένα προσαρμοσμένα σενάρια, πρέπει να τηρήσουμε τα ακόλουθα σημεία
- Οι στήλες θα μετατραπούν σε συμβολοσειρά και θα οριοθετηθούν από το TAB πριν τη δώσουν στο σενάριο χρήστη
- Η τυπική έξοδος της δέσμης ενεργειών χρήστη θα αντιμετωπίζεται ως στήλες συμβολοσειρών που χωρίζονται από TAB
Δείγμα ενσωματωμένου σεναρίου,
FROM ( FROM pv_users MAP pv_users.userid, pv_users.date USING 'map_script' AS dt, uid CLUSTER BY dt) map_output INSERT OVERWRITE TABLE pv_users_reduced REDUCE map_output.dt, map_output.uid USING 'reduce_script' AS date, count;
Από το παραπάνω σενάριο, μπορούμε να παρατηρήσουμε τα εξής
Αυτό είναι μόνο το δείγμα σεναρίου για κατανόηση
- Το pv_users είναι ο πίνακας χρηστών που έχει πεδία όπως το userid και την ημερομηνία όπως αναφέρονται στο map_script
- Το σενάριο Reducer ορίζεται στην ημερομηνία και τον αριθμό των πινάκων pv_users