Γεια σου Χαμπρ! Σας παρουσιάζω τη μετάφραση του άρθρου από τους Burak Yavuz, Brenner Heintz και Denny Lee, το οποίο προετοιμάστηκε ενόψει της έναρξης του μαθήματος από το OTUS.

Τα δεδομένα, όπως και η εμπειρία μας, συσσωρεύονται και εξελίσσονται συνεχώς. Για να συμβαδίσουν, τα νοητικά μας μοντέλα για τον κόσμο πρέπει να προσαρμοστούν σε νέα δεδομένα, μερικά από τα οποία περιέχουν νέες διαστάσεις - νέους τρόπους παρατήρησης πραγμάτων για τα οποία δεν είχαμε ιδέα πριν. Αυτά τα νοητικά μοντέλα δεν διαφέρουν από τα σχήματα υπολογιστικών φύλλων που καθορίζουν τον τρόπο με τον οποίο ταξινομούμε και επεξεργαζόμαστε νέες πληροφορίες.
Αυτό μας φέρνει στο ζήτημα της διαχείρισης κυκλωμάτων. Καθώς οι επιχειρηματικοί στόχοι και οι απαιτήσεις αλλάζουν με την πάροδο του χρόνου, αλλάζει και η δομή των δεδομένων σας. Το Delta Lake διευκολύνει την εισαγωγή νέων διαστάσεων καθώς αλλάζουν τα δεδομένα σας. Οι χρήστες έχουν πρόσβαση σε απλή σημασιολογία για να διαχειρίζονται τα σχήματα πινάκων τους. Αυτά τα εργαλεία περιλαμβάνουν το Schema Enforcement, το οποίο προστατεύει τους χρήστες από το να γεμίζουν ακούσια τους πίνακες με σφάλματα ή περιττά δεδομένα, και το Schema Evolution, το οποίο σας επιτρέπει να προσθέτετε αυτόματα νέες στήλες με πολύτιμα δεδομένα στις κατάλληλες θέσεις. Σε αυτό το άρθρο, θα εμβαθύνουμε στη χρήση αυτών των εργαλείων.
Κατανόηση των σχημάτων πίνακα
Κάθε DataFrame στο Apache Spark περιέχει ένα σχήμα που ορίζει το σχήμα των δεδομένων, όπως τύπους δεδομένων, στήλες και μεταδεδομένα. Με το Delta Lake, το σχήμα πίνακα αποθηκεύεται σε μορφή JSON μέσα στο αρχείο καταγραφής συναλλαγών.
Τι είναι η εφαρμογή του σχεδίου;
Η Επιβολή Σχήματος, γνωστή και ως Επικύρωση Σχήματος, είναι ένας μηχανισμός ασφαλείας στο Delta Lake που διασφαλίζει την ποιότητα των δεδομένων απορρίπτοντας εγγραφές που δεν συμμορφώνονται με το σχήμα πίνακα. Όπως η οικοδέσποινα στη ρεσεψιόν σε ένα δημοφιλές εστιατόριο που δέχεται μόνο κρατήσεις, ελέγχει αν κάθε στήλη δεδομένων που εισάγεται στον πίνακα βρίσκεται στην αντίστοιχη λίστα αναμενόμενων στηλών (με άλλα λόγια, αν υπάρχει "κράτηση" για καθεμία) και απορρίπτει τυχόν καταχωρίσεις με στήλες που δεν υπάρχουν στη λίστα.
Πώς λειτουργεί η επιβολή σχήματος;
Το Delta Lake χρησιμοποιεί έλεγχο σχήματος κατά την εγγραφή, πράγμα που σημαίνει ότι όλες οι νέες εγγραφές σε έναν πίνακα ελέγχονται για συμβατότητα με το σχήμα του πίνακα προορισμού κατά τη στιγμή της εγγραφής. Εάν το σχήμα είναι ασυνεπές, το Delta Lake αναιρεί πλήρως τη συναλλαγή (δεν γράφονται δεδομένα) και δημιουργεί μια εξαίρεση για να ενημερώσει τον χρήστη για την ασυνέπεια.
Το Delta Lake χρησιμοποιεί τους ακόλουθους κανόνες για να προσδιορίσει εάν μια εγγραφή είναι συμβατή με έναν πίνακα. DataFrame που γράφεται:
- δεν μπορεί να περιέχει πρόσθετες στήλες που δεν βρίσκονται στο σχήμα πίνακα προορισμού. Αντίθετα, δεν υπάρχει πρόβλημα αν τα εισερχόμενα δεδομένα δεν περιέχουν απολύτως κάθε στήλη από τον πίνακα - σε αυτές τις στήλες απλώς θα αντιστοιχιστούν τιμές null.
- Δεν είναι δυνατή η ύπαρξη τύπων δεδομένων στηλών που διαφέρουν από τους τύπους δεδομένων στηλών στον πίνακα προορισμού. Εάν μια στήλη στον πίνακα προορισμού περιέχει δεδομένα StringType αλλά η αντίστοιχη στήλη στο DataFrame περιέχει δεδομένα IntegerType, η επιβολή σχήματος θα δημιουργήσει μια εξαίρεση και θα αποτρέψει την εκτέλεση της λειτουργίας εγγραφής.
- δεν μπορεί να περιέχει ονόματα στηλών που διαφέρουν μόνο κατά την κεφαλαία και πεζά. Αυτό σημαίνει ότι δεν μπορείτε να έχετε στήλες με ονόματα 'Foo' και 'foo' που ορίζονται στον ίδιο πίνακα. Ενώ το Spark μπορεί να χρησιμοποιηθεί σε λειτουργία με διάκριση πεζών-κεφαλαίων ή χωρίς διάκριση πεζών-κεφαλαίων (προεπιλογή), το Delta Lake διατηρεί τη διάκριση πεζών-κεφαλαίων αλλά δεν είναι ευαίσθητο εντός της αποθήκευσης σχήματος. Το Parquet κάνει διάκριση πεζών-κεφαλαίων κατά την αποθήκευση και την επιστροφή πληροφοριών στήλης. Για να αποφύγουμε πιθανά σφάλματα, αλλοίωση ή απώλεια δεδομένων (κάτι που έχουμε βιώσει προσωπικά στην Databricks), αποφασίσαμε να προσθέσουμε αυτόν τον περιορισμό.
Για να το δείξουμε αυτό, ας ρίξουμε μια ματιά σε αυτό που συμβαίνει στον παρακάτω κώδικα όταν προσπαθείτε να προσθέσετε μερικές νέες στήλες σε έναν πίνακα Delta Lake που δεν έχει ακόμη ρυθμιστεί ώστε να τις αποδέχεται.
# Сгенерируем DataFrame ссуд, который мы добавим в нашу таблицу Delta Lake
loans = sql("""
SELECT addr_state, CAST(rand(10)*count as bigint) AS count,
CAST(rand(10) * 10000 * count AS double) AS amount
FROM loan_by_state_delta
""")
# Вывести исходную схему DataFrame
original_loans.printSchema()
root
|-- addr_state: string (nullable = true)
|-- count: integer (nullable = true)
# Вывести новую схему DataFrame
loans.printSchema()
root
|-- addr_state: string (nullable = true)
|-- count: integer (nullable = true)
|-- amount: double (nullable = true) # new column
# Попытка добавить новый DataFrame (с новым столбцом) в существующую таблицу
loans.write.format("delta")
.mode("append")
.save(DELTALAKE_PATH)
Returns:
A schema mismatch detected when writing to the Delta table.
To enable schema migration, please set:
'.option("mergeSchema", "true")'
Table schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
Data schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
-- amount: double (nullable = true)
If Table ACLs are enabled, these options will be ignored. Please use the ALTER TABLE command for changing the schema.Αντί να προσθέτει αυτόματα νέες στήλες, το Delta Lake επιβάλλει ένα σχήμα και σταματά την εγγραφή. Για να προσδιορίσει ποια στήλη (ή σύνολο στηλών) προκαλεί την απόκλιση, το Spark εξάγει και τα δύο σχήματα από την ιχνηλάτηση στοίβας για σύγκριση.
Ποιο είναι το όφελος από την εφαρμογή του σχεδίου;
Επειδή η επιβολή σχήματος είναι ένας αρκετά αυστηρός έλεγχος, είναι ένα εξαιρετικό εργαλείο που μπορεί να χρησιμοποιηθεί ως ελεγκτής για ένα καθαρό, πλήρως μετασχηματισμένο σύνολο δεδομένων που είναι έτοιμο για παραγωγή ή κατανάλωση. Συνήθως εφαρμόζεται σε πίνακες που παρέχουν απευθείας δεδομένα:
- Αλγόριθμοι μηχανικής μάθησης
- Πίνακες ελέγχου επιχειρηματικής ευφυΐας (BI)
- Εργαλεία ανάλυσης και οπτικοποίησης δεδομένων
- Οποιοδήποτε σύστημα παραγωγής που απαιτεί αυστηρά δομημένα, αυστηρά τυποποιημένα σημασιολογικά σχήματα.
Για να προετοιμάσουν τα δεδομένα τους για αυτό το τελευταίο εμπόδιο, πολλοί χρήστες χρησιμοποιούν μια απλή αρχιτεκτονική «πολλαπλών αλμάτων» που εισάγει σταδιακά δομή στους πίνακές τους. Για να μάθετε περισσότερα σχετικά με αυτό, μπορείτε να διαβάσετε το άρθρο
Φυσικά, μπορείτε να χρησιμοποιήσετε την επιβολή σχήματος οπουδήποτε στη διοχέτευσή σας, αλλά να θυμάστε ότι η εγγραφή σε έναν πίνακα σε αυτήν την περίπτωση μπορεί να είναι απογοητευτική, για παράδειγμα επειδή ξεχάσατε ότι προσθέσατε μια άλλη στήλη στα εισερχόμενα δεδομένα.
Πρόληψη ρευστοποίησης δεδομένων
Σε αυτό το σημείο ίσως αναρωτιέστε γιατί γίνεται όλη αυτή η φασαρία; Άλλωστε, μερικές φορές ένα απροσδόκητο σφάλμα "αναντιστοιχίας σχήματος" μπορεί να σας προκαλέσει εμπλοκή στη ροή εργασίας σας, ειδικά αν είστε νέοι στο Delta Lake. Γιατί να μην αφήσω το σχήμα να αλλάζει όποτε χρειάζεται, ώστε να μπορώ να γράψω το DataFrame μου ό,τι και να γίνει;
Όπως λέει και η παλιά παροιμία, «μια ουγγιά πρόληψης αξίζει μια λίβρα θεραπείας». Κάποια στιγμή, αν δεν προσέξετε την εφαρμογή του σχήματός σας, θα εμφανιστούν προβλήματα συμβατότητας τύπων δεδομένων - φαινομενικά ομοιογενείς ακατέργαστες πηγές δεδομένων μπορεί να περιέχουν πεζά-κεφαλαία, κατεστραμμένες στήλες, λανθασμένες αντιστοιχίσεις ή άλλα τρομακτικά πράγματα που κάνουν τους εφιάλτες σας πραγματικότητα. Η καλύτερη προσέγγιση είναι να σταματήσετε αυτούς τους εχθρούς στην πύλη - με την επιβολή σχήματος - και να τους αντιμετωπίσετε στο φως, αντί να τους αντιμετωπίσετε αργότερα, όταν αρχίσουν να παραμονεύουν στα σκοτεινά βάθη του κώδικα παραγωγής σας.
Η επιβολή του σχήματος διασφαλίζει ότι το σχήμα του πίνακά σας δεν θα αλλάξει, εκτός εάν δεσμευτείτε ρητά για την αλλαγή. Αυτό αποτρέπει την αραίωση των δεδομένων, η οποία μπορεί να συμβεί όταν νέες στήλες προστίθενται τόσο συχνά που προηγουμένως πολύτιμοι, συμπιεσμένοι πίνακες χάνουν το νόημα και τη χρησιμότητά τους λόγω της πλημμύρας δεδομένων. Ενθαρρύνοντάς σας να είστε συνειδητοί, να θέτετε υψηλά πρότυπα και να περιμένετε υψηλή ποιότητα, η επιβολή σχήματος κάνει ακριβώς αυτό που είχε σκοπό να κάνει - να σας βοηθήσει να παραμείνετε ευσυνείδητοι και τα υπολογιστικά σας φύλλα καθαρά.
Αν, μετά από περαιτέρω σκέψη, αποφασίσετε ότι πραγματικά ανάγκη προσθέστε μια νέα στήλη - κανένα πρόβλημα, παρακάτω υπάρχει μια διόρθωση μίας γραμμής. Η λύση είναι η εξέλιξη του σχεδίου!
Τι είναι η εξέλιξη του σχήματος;
Η εξέλιξη σχήματος είναι μια λειτουργία που επιτρέπει στους χρήστες να αλλάζουν εύκολα το τρέχον σχήμα ενός πίνακα για να συμπεριλάβουν δεδομένα που αλλάζουν με την πάροδο του χρόνου. Χρησιμοποιείται συνήθως κατά την εκτέλεση μιας λειτουργίας προσθήκης ή επανεγγραφής για την αυτόματη προσαρμογή του σχήματος ώστε να συμπεριλάβει μία ή περισσότερες νέες στήλες.
Πώς λειτουργεί η εξέλιξη του σχήματος;
Ακολουθώντας το παράδειγμα στην προηγούμενη ενότητα, οι προγραμματιστές μπορούν εύκολα να χρησιμοποιήσουν την εξέλιξη σχήματος για να προσθέσουν νέες στήλες που είχαν απορριφθεί προηγουμένως λόγω μη συμμόρφωσης με το σχήμα. Η εξέλιξη του σχήματος ενεργοποιείται με την προσθήκη .option('mergeSchema', 'true') στην ομάδα Spark σας .write или .writeStream.
# Добавьте параметр mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)Για να δείτε το γράφημα, εκτελέστε το ακόλουθο ερώτημα Spark SQL
# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10 
Εναλλακτικά, μπορείτε να ορίσετε αυτήν την επιλογή για ολόκληρη την περίοδο λειτουργίας Spark προσθέτοντας spark.databricks.delta.schema.autoMerge = True στη διαμόρφωση Spark. Αλλά χρησιμοποιήστε το με προσοχή, καθώς η επιβολή σχήματος δεν θα σας προειδοποιεί πλέον για ακούσιες ασυνέπειες σχήματος.
Συμπεριλαμβάνοντας μια παράμετρο στο αίτημα mergeSchema, όλες οι στήλες που υπάρχουν στο DataFrame αλλά όχι στον πίνακα προορισμού προστίθενται αυτόματα στο τέλος του σχήματος ως μέρος της συναλλαγής εγγραφής. Μπορούν επίσης να προστεθούν ένθετα πεδία, τα οποία θα προστεθούν επίσης στο τέλος των αντίστοιχων στηλών δομής.
Οι μηχανικοί δεδομένων και οι επιστήμονες μπορούν να χρησιμοποιήσουν αυτήν την επιλογή για να προσθέσουν νέες στήλες (ίσως μια πρόσφατα παρακολουθούμενη μέτρηση ή μια στήλη με στοιχεία πωλήσεων για αυτόν τον μήνα) στους υπάρχοντες πίνακες παραγωγής μηχανικής μάθησης χωρίς να διαταράξουν τα υπάρχοντα μοντέλα που βασίζονται στις παλιές στήλες.
Οι ακόλουθοι τύποι αλλαγών σχήματος επιτρέπονται ως μέρος της εξέλιξης σχήματος κατά την προσθήκη ή την επανεγγραφή πίνακα:
- Προσθήκη νέων στηλών (αυτό είναι το πιο συνηθισμένο σενάριο)
- Αλλαγή τύπων δεδομένων από NullType -> οποιοσδήποτε άλλος τύπος ή προώθηση από ByteType -> ShortType -> IntegerType
Άλλες αλλαγές που δεν επιτρέπονται στην εξέλιξη του σχήματος απαιτούν την αντικατάσταση του σχήματος και των δεδομένων με την προσθήκη .option("overwriteSchema", "true"). Για παράδειγμα, εάν η στήλη "Foo" ήταν αρχικά ακέραιος αριθμός και το νέο σχήμα ήταν ένας τύπος δεδομένων συμβολοσειράς, τότε όλα τα αρχεία Parquet (δεδομένων) θα έπρεπε να αντικατασταθούν. Αυτές οι αλλαγές περιλαμβάνουν:
- διαγραφή στήλης
- αλλαγή τύπου δεδομένων υπάρχουσας στήλης (στη θέση της)
- μετονομασία στηλών που διαφέρουν μόνο κατά πεζά-κεφαλαία (π.χ. "Foo" και "foo")
Τέλος, με την επόμενη έκδοση του Spark 3.0, θα υποστηρίζεται πλήρως η ρητή DDL (χρησιμοποιώντας το ALTER TABLE), επιτρέποντας στους χρήστες να εκτελούν τις ακόλουθες ενέργειες σε σχήματα πινάκων:
- προσθήκη στηλών
- αλλαγή σχολίων στηλών
- Ορισμός ιδιοτήτων πίνακα που καθορίζουν τη συμπεριφορά του πίνακα, όπως ο καθορισμός της χρονικής διάρκειας διατήρησης του αρχείου καταγραφής συναλλαγών.
Ποιο είναι το όφελος της εξέλιξης του σχήματος;
Η εξέλιξη του σχήματος μπορεί να χρησιμοποιηθεί όποτε εσείς σκοπεύω αλλάξτε το σχήμα του πίνακά σας (σε αντίθεση με εκείνες τις περιπτώσεις όπου προσθέσατε κατά λάθος στήλες στο DataFrame σας που δεν θα έπρεπε να υπάρχουν εκεί). Αυτός είναι ο ευκολότερος τρόπος μετεγκατάστασης του σχήματός σας, επειδή προσθέτει αυτόματα τα σωστά ονόματα στηλών και τύπους δεδομένων χωρίς να χρειάζεται να τα δηλώσετε ρητά.
Συμπέρασμα
Η επιβολή σχήματος απορρίπτει τυχόν νέες στήλες ή άλλες αλλαγές σχήματος που δεν είναι συμβατές με τον πίνακά σας. Θέτοντας και διατηρώντας αυτά τα υψηλά πρότυπα, οι αναλυτές και οι μηχανικοί μπορούν να εμπιστευτούν ότι τα δεδομένα τους έχουν το υψηλότερο επίπεδο ακεραιότητας, συλλογιζόμενοι με σαφήνεια και ακρίβεια, επιτρέποντάς τους να λαμβάνουν καλύτερες επιχειρηματικές αποφάσεις.
Από την άλλη πλευρά, η εξέλιξη του συστήματος συμπληρώνει την επιβολή απλοποιώντας υποτιθεμένος αυτόματες αλλαγές σχήματος. Άλλωστε, δεν θα έπρεπε να είναι τόσο δύσκολο να προσθέσετε μια στήλη.
Η αναγκαστική εφαρμογή ενός σχήματος είναι γιανγκ, ενώ η εξέλιξη του σχήματος είναι γιν. Όταν χρησιμοποιούνται μαζί, αυτά τα χαρακτηριστικά κάνουν την καταστολή θορύβου και τον συντονισμό σήματος ευκολότερο από ποτέ.
Θα θέλαμε επίσης να ευχαριστήσουμε τους Mukul Murthy και Pranav Anand για τη συμβολή τους σε αυτό το άρθρο.
Άλλα άρθρα αυτής της σειράς:

Σχετικά Άρθρα
Πηγή: www.habr.com
