Szia Habr! Figyelmébe ajánlom a cikk fordítását
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
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
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:
Kapcsolódó cikkek
Forrás: will.com