Merüljön el a Delta Lake: Schema Enforcement and Evolution

Szia Habr! Figyelmébe ajánlom a cikk fordítását "Buvárgás a Delta-tóba: Sémák érvényesítése és evolúciója" Burak Yavuz, Brenner Heintz és Denny Lee szerzői, amely a tanfolyam kezdetére készült Adatmérnök az OTUS-tól.

Merüljön el a Delta Lake: Schema Enforcement and Evolution

Tapasztalatainkhoz hasonlóan az adatok is folyamatosan gyűlnek és fejlődnek. Ahhoz, hogy lépést tarthassunk, a világról alkotott mentális modelleinknek alkalmazkodniuk kell az új adatokhoz, amelyek némelyike ​​új dimenziókat tartalmaz – olyan dolgok megfigyelésének új módjait, amelyekről korábban fogalmunk sem volt. Ezek a mentális modellek nem sokban különböznek azoktól a táblázatsémáktól, amelyek meghatározzák, hogyan kategorizáljuk és dolgozzuk fel az új információkat.

Ezzel el is érkeztünk a sémakezelés kérdéséhez. Ahogy az üzleti kihívások és követelmények idővel változnak, úgy változik az adatok szerkezete is. A Delta Lake megkönnyíti az új mérések bevezetését az adatok változása esetén. A felhasználók egyszerű szemantikához férhetnek hozzá táblasémáik kezeléséhez. Ezek az eszközök közé tartozik a Schema Enforcement, amely megvédi a felhasználókat attól, hogy tábláikat véletlenül hibákkal vagy szükségtelen adatokkal szennyezzék be, valamint a Schema Evolution, amely lehetővé teszi az értékes adatok új oszlopainak automatikus hozzáadását a megfelelő helyekre. Ebben a cikkben részletesebben foglalkozunk ezen eszközök használatával.

Táblasémák megértése

Az Apache Spark minden DataFrame-je tartalmaz egy sémát, amely meghatározza az adatok formáját, például adattípusokat, oszlopokat és metaadatokat. A Delta Lake esetében a táblaséma JSON formátumban kerül tárolásra a tranzakciós naplóban.

Mi a rendszer végrehajtása?

A Schema Enforcement, más néven sémaérvényesítés, egy biztonsági mechanizmus a Delta Lake-ben, amely biztosítja az adatminőséget azáltal, hogy elutasítja azokat a rekordokat, amelyek nem egyeznek a tábla sémájával. Mint egy népszerű, csak foglalásokkal rendelkező étterem recepciójának háziasszonya, ő is ellenőrzi, hogy a táblázatba bevitt adatok minden egyes oszlopa szerepel-e a várt oszlopok megfelelő listájában (vagyis van-e "foglalás" mindegyikhez ), és elutasít minden olyan rekordot, amelynek oszlopai nem szerepelnek a listában.

Hogyan működik a séma érvényesítése?

A Delta Lake írási séma-ellenőrzést használ, ami azt jelenti, hogy a táblába minden új írást a rendszer az írási időben ellenőrzi a céltábla sémájával való kompatibilitás szempontjából. Ha a séma inkonzisztens, a Delta Lake teljesen megszakítja a tranzakciót (nincs adat írva), és kivételt állít fel, hogy értesítse a felhasználót az inkonzisztenciáról.
A Delta Lake a következő szabályokat használja annak meghatározására, hogy egy rekord kompatibilis-e egy táblázattal. Írható DataFrame:

  • nem tartalmazhat további oszlopokat, amelyek nem szerepelnek a céltábla sémájában. Ezzel szemben minden rendben van, ha a bejövő adatok nem tartalmazzák a táblázat összes oszlopát - ezek az oszlopok egyszerűen null értékeket kapnak.
  • nem rendelkezhetnek olyan oszlop adattípusokkal, amelyek eltérnek a céltábla oszlopainak adattípusaitól. Ha a céltábla oszlopa StringType adatokat tartalmaz, de a DataFrame megfelelő oszlopa IntegerType adatokat tartalmaz, a séma végrehajtása kivételt dob, és megakadályozza az írási művelet végrehajtását.
  • nem tartalmazhat olyan oszlopneveket, amelyek csak kis- és nagybetűben térnek el egymástól. Ez azt jelenti, hogy nem lehet 'Foo' és 'foo' nevű oszlopokat definiálni ugyanabban a táblázatban. Míg a Spark használható kis- és nagybetűérzékeny (alapértelmezett) módban, a Delta Lake megőrzi a kis- és nagybetűket, de érzéketlen a sématárolón belül. A parketta megkülönbözteti a kis- és nagybetűket az oszlopadatok tárolásakor és visszaküldésekor. Az esetleges hibák, adatsérülések vagy adatvesztések elkerülése érdekében (amit személyesen tapasztaltunk a Databricksnél), úgy döntöttünk, hogy hozzáadjuk ezt a korlátozást.

Ennek szemléltetésére nézzük meg, mi történik az alábbi kódban, amikor megpróbálunk néhány újonnan generált oszlopot hozzáadni egy olyan Delta Lake táblához, amely még nincs beállítva ezek elfogadására.

# Сгенерируем 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.

Az új oszlopok automatikus hozzáadása helyett a Delta Lake sémát ír elő, és leállítja az írást. Annak meghatározásához, hogy melyik oszlop (vagy oszlopkészlet) okozza az eltérést, a Spark összehasonlítás céljából mindkét sémát kiadja a verem nyomkövetéséből.

Milyen előnyökkel jár egy séma érvényesítése?

Mivel a séma érvényesítése meglehetősen szigorú ellenőrzés, kiváló eszköz egy tiszta, teljesen átalakított, gyártásra vagy fogyasztásra kész adatkészlet kapuőreként. Általában olyan táblázatokra alkalmazzák, amelyek közvetlenül adatot táplálnak:

  • Gépi tanulási algoritmusok
  • BI irányítópultok
  • Adatelemző és vizualizációs eszközök
  • Minden olyan termelési rendszer, amely erősen strukturált, erősen tipizált szemantikai sémákat igényel.

Az adatok előkészítéséhez erre a végső akadályra sok felhasználó egy egyszerű „többugrásos” architektúrát használ, amely fokozatosan struktúrát épít be a táblázatába. Ha többet szeretne megtudni erről, tekintse meg a cikket Gyártási szintű gépi tanulás a Delta Lake segítségével.

Természetesen a séma érvényesítése bárhol használható a folyamatban, de ne feledje, hogy ebben az esetben a táblába való adatfolyam frusztráló lehet, mert például elfelejtette, hogy egy másik oszlopot adott hozzá a bejövő adatokhoz.

Az adatok felhígulásának megakadályozása

Mostanra talán azon tűnődsz, mi ez a felhajtás? Végtére is, néha egy váratlan "séma mismatch" hiba megzavarhatja a munkafolyamatot, különösen akkor, ha még nem ismeri a Delta Lake-et. Miért nem hagyja, hogy a séma szükség szerint megváltozzon, hogy bármitől függetlenül megírhassam a DataFrame-emet?

Ahogy a régi mondás tartja: „Egy csepp megelőzés megér egy font gyógymódot”. Egy bizonyos ponton, ha nem gondoskodik a séma érvényesítéséről, az adattípus-kompatibilitási problémák felütik a fejüket – a látszólag homogén nyers adatforrások szélső eseteket, sérült oszlopokat, rosszul formázott leképezéseket vagy más ijesztő dolgokat tartalmazhatnak. rémálmok. A legjobb megközelítés az, ha megállítod ezeket az ellenségeket a kapuban – a séma érvényesítésével –, és a fényben kezeled őket, nem pedig később, amikor a termelési kódod sötét mélységein kezdenek bujkálni.

A séma érvényesítése biztosítékot ad arra, hogy a tábla sémája nem fog megváltozni, hacsak nem hagyja jóvá a változtatást. Ez megakadályozza az adatok felhígulását, amely akkor fordulhat elő, ha olyan gyakran adnak hozzá új oszlopokat, hogy a korábban értékes, tömörített táblák elvesztik értelmüket és hasznosságukat az adatok elárasztása miatt. Szándékosságra, magas követelmények felállítására és magas minőség elvárására ösztönözve a séma-érvényesítés pontosan azt teszi, amire tervezték – segít megőrizni a lelkiismeretességet, és tisztán tartani a táblázatokat.

Ha további mérlegelés után úgy dönt, hogy valóban szükség új oszlop hozzáadása - nem probléma, alább egy egysoros javítás található. A megoldás az áramkör evolúciója!

Mi az a séma evolúció?

A sémafejlődés egy olyan szolgáltatás, amely lehetővé teszi a felhasználók számára, hogy egyszerűen módosítsák az aktuális táblázatsémát az idővel változó adatok szerint. Leggyakrabban egy hozzáfűzési vagy átírási művelet végrehajtása során használatos, hogy a sémát automatikusan hozzáigazítsák egy vagy több új oszlophoz.

Hogyan működik a séma evolúciója?

Az előző szakasz példáját követve a fejlesztők egyszerűen használhatják a séma evolúcióját új oszlopok hozzáadására, amelyeket korábban a séma inkonzisztenciája miatt elutasítottak. Az áramkör evolúciója a hozzáadással aktiválódik .option('mergeSchema', 'true') a Spark csapatához .write или .writeStream.

# Добавьте параметр mergeSchema
loans.write.format("delta") 
           .option("mergeSchema", "true") 
           .mode("append") 
           .save(DELTALAKE_SILVER_PATH)

A grafikon megtekintéséhez futtassa a következő Spark SQL-lekérdezést

# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10

Merüljön el a Delta Lake: Schema Enforcement and Evolution
Alternatív megoldásként hozzáadásával beállíthatja ezt a lehetőséget a teljes Spark-munkamenetre spark.databricks.delta.schema.autoMerge = True a Spark konfigurációhoz. De ezt óvatosan használja, mivel a séma érvényesítése többé nem figyelmezteti Önt a nem szándékos séma inkonzisztenciákra.

A paraméter megadásával a kérésben mergeSchema, minden olyan oszlop, amely a DataFrame-ben van, de nem a céltáblában, automatikusan hozzáadódik a séma végéhez egy írási tranzakció részeként. Beágyazott mezők is hozzáadhatók, és ezek szintén a megfelelő szerkezeti oszlopok végére kerülnek.

A dátummérnökök és adatkutatók ezzel a lehetőséggel új oszlopokat (talán egy nemrégiben követett mérőszámot vagy az e havi értékesítési teljesítmény oszlopot) adhatnak hozzá meglévő gépi tanulási termelési táblázataikhoz anélkül, hogy a régi oszlopokon alapuló meglévő modelleket megtörnék.

A következő típusú sémamódosítások megengedettek a séma evolúciójának részeként a táblázat hozzáadása vagy átírása során:

  • Új oszlopok hozzáadása (ez a leggyakoribb forgatókönyv)
  • Adattípusok megváltoztatása NullType -> bármilyen más típusból vagy előléptetés a ByteType -> ShortType -> IntegerType formátumból

A séma evolúciójában nem engedélyezett egyéb változtatásokhoz a séma és az adatok hozzáadásával újra kell írni .option("overwriteSchema", "true"). Például abban az esetben, ha a "Foo" oszlop eredetileg egy egész szám volt, az új séma pedig egy karakterlánc adattípus, akkor az összes Parquet(data) fájlt át kell írni. Ilyen változások a következők:

  • oszlop törlése
  • meglévő oszlop adattípusának módosítása (helyben)
  • olyan oszlopok átnevezése, amelyek csak kis- és nagybetűkben különböznek egymástól (például "Foo" és "foo")

Végül, a Spark 3.0 következő kiadásával az explicit DDL teljes mértékben támogatott lesz (ALTER TABLE használatával), amely lehetővé teszi a felhasználók számára, hogy a következő műveleteket hajtsák végre a táblázatsémákon:

  • oszlopok hozzáadása
  • oszlop megjegyzéseinek megváltoztatása
  • a tábla viselkedését szabályozó táblatulajdonságok beállítása, például a tranzakciós napló tárolási idejének beállítása.

Mi az előnye az áramkör evolúciójának?

A séma evolúció bármikor használható szándékozik módosítsa a táblázat sémáját (ellentétben azzal, amikor véletlenül olyan oszlopokat adott hozzá a DataFrame-hez, amelyeknek nem kellene ott lennie). Ez a séma áttelepítésének legegyszerűbb módja, mivel automatikusan hozzáadja a megfelelő oszlopneveket és adattípusokat anélkül, hogy kifejezetten deklarálnia kellene őket.

Következtetés

A séma betartatása elutasít minden olyan új oszlopot vagy egyéb sémamódosítást, amely nem kompatibilis a táblázattal. E magas szintű szabványok felállításával és fenntartásával az elemzők és mérnökök bízhatnak abban, hogy adataik a legmagasabb szintű integritást biztosítják, világosan és világosan kommunikálják azokat, lehetővé téve számukra, hogy jobb üzleti döntéseket hozzanak.

Másrészt a séma evolúciója egyszerűsítéssel egészíti ki a végrehajtást állítólagos automatikus sémaváltások. Végül is nem lehet nehéz egy oszlop hozzáadása.

A séma kényszeralkalmazása a yang, ahol a séma evolúciója a yin. Együtt használva ezek a funkciók minden eddiginél egyszerűbbé teszik a zajelnyomást és a jelhangolást.

Ezúton is szeretnénk köszönetet mondani Mukul Murthynak és Pranav Anandnak a cikkhez való hozzájárulásukért.

A sorozat további cikkei:

Merüljön el a Delta Lake-ben: A tranzakciós napló kicsomagolása

Kapcsolódó cikkek

Gyártási szintű gépi tanulás a Delta Lake segítségével

Mi az a Data Lake?

Tudjon meg többet a tanfolyamról

Forrás: will.com

Hozzászólás