Dive into Delta Lake: Schema Enforcement and Evolution

Γεια σου Χαμπρ! Σας παρουσιάζω τη μετάφραση του άρθρου "Diving Into Delta Lake: Schema Enforcement & Evolution" συγγραφείς Burak Yavuz, Brenner Heintz και Denny Lee, το οποίο προετοιμάστηκε εν όψει της έναρξης του μαθήματος Μηχανικός Δεδομένων από το OTUS.

Dive into Delta Lake: Schema Enforcement and Evolution

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

Αυτό μας φέρνει στο ζήτημα της διαχείρισης σχημάτων. Καθώς οι επιχειρηματικές προκλήσεις και απαιτήσεις αλλάζουν με την πάροδο του χρόνου, αλλάζουν και η δομή των δεδομένων σας. Το Delta Lake διευκολύνει την εισαγωγή νέων μετρήσεων καθώς αλλάζουν τα δεδομένα. Οι χρήστες έχουν πρόσβαση σε απλή σημασιολογία για τη διαχείριση των σχημάτων πινάκων τους. Αυτά τα εργαλεία περιλαμβάνουν το Schema Enforcement, το οποίο προστατεύει τους χρήστες από ακούσια ρύπανση των πινάκων τους με σφάλματα ή περιττά δεδομένα, και το Schema Evolution, το οποίο επιτρέπει την αυτόματη προσθήκη νέων στηλών πολύτιμων δεδομένων στις κατάλληλες τοποθεσίες. Σε αυτό το άρθρο, θα εμβαθύνουμε στη χρήση αυτών των εργαλείων.

Κατανόηση Σχημάτων Πίνακα

Κάθε DataFrame στο Apache Spark περιέχει ένα σχήμα που καθορίζει τη μορφή των δεδομένων, όπως τύπους δεδομένων, στήλες και μεταδεδομένα. Με το Delta Lake, το σχήμα πίνακα αποθηκεύεται σε μορφή JSON μέσα στο αρχείο καταγραφής συναλλαγών.

Τι είναι η επιβολή του συστήματος;

Το Schema Enforcement, γνωστό και ως Schema Validation, είναι ένας μηχανισμός ασφαλείας στο Delta Lake που διασφαλίζει την ποιότητα των δεδομένων απορρίπτοντας εγγραφές που δεν ταιριάζουν με το σχήμα του πίνακα. Όπως η οικοδέσποινα στη ρεσεψιόν ενός δημοφιλούς εστιατορίου μόνο για κρατήσεις, ελέγχει εάν κάθε στήλη δεδομένων που εισάγεται στον πίνακα βρίσκεται στην αντίστοιχη λίστα των αναμενόμενων στηλών (με άλλα λόγια, αν υπάρχει "κράτηση" για καθεμία από αυτές ) και απορρίπτει τυχόν εγγραφές με στήλες που δεν βρίσκονται στη λίστα.

Πώς λειτουργεί η επιβολή σχήματος;

Το Delta Lake χρησιμοποιεί έλεγχο σχήματος σε εγγραφή, που σημαίνει ότι όλες οι νέες εγγραφές στον πίνακα ελέγχονται για συμβατότητα με το σχήμα του πίνακα προορισμού τη στιγμή της εγγραφής. Εάν το σχήμα είναι ασυνεπές, η Delta Lake ματαιώνει πλήρως τη συναλλαγή (δεν υπάρχουν δεδομένα) και δημιουργεί μια εξαίρεση για να ειδοποιήσει τον χρήστη για την ασυνέπεια.
Το Delta Lake χρησιμοποιεί τους ακόλουθους κανόνες για να προσδιορίσει εάν μια εγγραφή είναι συμβατή με έναν πίνακα. Εγγράψιμο DataFrame:

  • δεν μπορεί να περιέχει πρόσθετες στήλες που δεν περιλαμβάνονται στο σχήμα του πίνακα προορισμού. Αντίθετα, όλα είναι καλά εάν τα εισερχόμενα δεδομένα δεν περιέχουν απολύτως όλες τις στήλες από τον πίνακα - σε αυτές τις στήλες θα εκχωρηθούν απλώς μηδενικές τιμές.
  • δεν μπορεί να έχει τύπους δεδομένων στηλών που είναι διαφορετικοί από τους τύπους δεδομένων των στηλών στον πίνακα προορισμού. Εάν η στήλη του πίνακα προορισμού περιέχει δεδομένα StringType, αλλά η αντίστοιχη στήλη στο DataFrame περιέχει δεδομένα IntegerType, η επιβολή σχήματος θα δημιουργήσει μια εξαίρεση και θα αποτρέψει την πραγματοποίηση της λειτουργίας εγγραφής.
  • δεν μπορεί να περιέχει ονόματα στηλών που διαφέρουν μόνο σε περίπτωση. Αυτό σημαίνει ότι δεν μπορείτε να ορίσετε στήλες με το όνομα "Foo" και "foo" στον ίδιο πίνακα. Ενώ το Spark μπορεί να χρησιμοποιηθεί σε λειτουργία διάκρισης πεζών-κεφαλαίων ή διάκρισης πεζών-κεφαλαίων (προεπιλογή), το Delta Lake διατηρεί τα πεζά και πεζά, αλλά δεν είναι ευαίσθητο εντός της αποθήκευσης σχήματος. Το παρκέ έχει διάκριση πεζών-κεφαλαίων κατά την αποθήκευση και την επιστροφή πληροφοριών στήλης. Για να αποφύγουμε πιθανά σφάλματα, καταστροφή δεδομένων ή απώλεια δεδομένων (κάτι που βιώσαμε προσωπικά στο 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.

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

Αποτροπή αραίωσης δεδομένων

Μέχρι τώρα μπορεί να αναρωτιέστε, τι είναι όλη η φασαρία; Εξάλλου, μερικές φορές ένα απροσδόκητο σφάλμα "αναντιστοιχίας σχήματος" μπορεί να σας παρασύρει στη ροή εργασιών σας, ειδικά αν είστε νέοι στο 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

Dive into Delta Lake: Schema Enforcement and Evolution
Εναλλακτικά, μπορείτε να ορίσετε αυτήν την επιλογή για ολόκληρη την περίοδο λειτουργίας Spark προσθέτοντας spark.databricks.delta.schema.autoMerge = True στη διαμόρφωση Spark. Αλλά χρησιμοποιήστε το με προσοχή, καθώς η επιβολή του σχήματος δεν θα σας ειδοποιεί πλέον για ακούσιες ασυνέπειες σχήματος.

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

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

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

  • Προσθήκη νέων στηλών (αυτό είναι το πιο συνηθισμένο σενάριο)
  • Αλλαγή τύπων δεδομένων από NullType -> οποιονδήποτε άλλο τύπο ή προώθηση από ByteType -> ShortType -> IntegerType

Άλλες αλλαγές που δεν επιτρέπονται στην εξέλιξη του σχήματος απαιτούν την επανεγγραφή του σχήματος και των δεδομένων με προσθήκη .option("overwriteSchema", "true"). Για παράδειγμα, στην περίπτωση που η στήλη "Foo" ήταν αρχικά ακέραιος και το νέο σχήμα ήταν τύπος δεδομένων συμβολοσειράς, τότε όλα τα αρχεία Parquet(data) θα πρέπει να ξαναγραφτούν. Τέτοιες αλλαγές περιλαμβάνουν:

  • διαγραφή στήλης
  • αλλαγή του τύπου δεδομένων μιας υπάρχουσας στήλης (επί τόπου)
  • μετονομασία στηλών που διαφέρουν μόνο κατά περίπτωση (για παράδειγμα, "Foo" και "foo")

Τέλος, με την επόμενη έκδοση του Spark 3.0, το ρητό DDL θα υποστηρίζεται πλήρως (χρησιμοποιώντας το ALTER TABLE), επιτρέποντας στους χρήστες να εκτελούν τις ακόλουθες ενέργειες σε σχήματα τραπεζιών:

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

Ποιο είναι το όφελος της εξέλιξης του κυκλώματος;

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

Συμπέρασμα

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

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

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

Θα θέλαμε επίσης να ευχαριστήσουμε τους Mukul Murthy και Pranav Anand για τη συμβολή τους σε αυτό το άρθρο.

Άλλα άρθρα αυτής της σειράς:

Dive into Delta Lake: Αποσυσκευασία του αρχείου καταγραφής συναλλαγών

Σχετικά Άρθρα

Μηχανική εκμάθηση βαθμού παραγωγής με την Delta Lake

Τι είναι μια λίμνη δεδομένων;

Μάθετε περισσότερα για το μάθημα

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο