Ponořte se do Delta Lake: Vynucení schématu a vývoj

Čau Habr! Předkládám vaší pozornosti překlad článku „Potápění do jezera Delta: Prosazování schématu a evoluce“ autorů Burak Yavuz, Brenner Heintz a Denny Lee, který byl připraven v očekávání zahájení kurzu datový inženýr od společnosti OTUS.

Ponořte se do Delta Lake: Vynucení schématu a vývoj

Data, stejně jako naše zkušenosti, se neustále hromadí a vyvíjejí. Abychom udrželi krok, naše mentální modely světa se musí přizpůsobit novým datům, z nichž některá obsahují nové dimenze – nové způsoby vidění věcí, o kterých jsme dříve neměli ani tušení. Tyto mentální modely se příliš neliší od tabulkových schémat, která řídí, jak kategorizujeme a zpracováváme nové informace.

Tím se dostáváme k problematice správy schémat. Jak se v průběhu času mění obchodní cíle a požadavky, mění se i struktura vašich dat. Delta Lake usnadňuje implementaci nových měření při změnách dat. Uživatelé mají přístup k jednoduché sémantice pro správu schémat tabulek. Mezi tyto nástroje patří Schema Enforcement, který chrání uživatele před nechtěným znečištěním jejich tabulek chybami nebo nepotřebnými daty, a Schema Evolution, který umožňuje automatické přidávání nových sloupců cenných dat na vhodná místa. V tomto článku se ponoříme do použití těchto nástrojů.

Pochopení schémat tabulek

Každý DataFrame v Apache Spark obsahuje schéma, které definuje tvar dat, jako jsou datové typy, sloupce a metadata. S Delta Lake je schéma tabulky uloženo ve formátu JSON uvnitř protokolu transakcí.

Co je Schema Enforcement?

Schema Enforcement, také známý jako Schema Validation, je ochranný mechanismus v Delta Lake, který zaručuje kvalitu dat tím, že odmítá záznamy, které neodpovídají schématu tabulky. Jako hosteska na recepci oblíbené restaurace, která přijímá pouze rezervace, kontroluje, zda každý sloupec údajů zapsaných do tabulky je v odpovídajícím seznamu očekávaných sloupců (jinými slovy, zda existuje „rezervace“ pro každý z nich) a odmítne všechny položky se sloupci, které nejsou v seznamu.

Jak funguje vynucení schématu?

Delta Lake používá ověřování schématu při zápisu, což znamená, že všechny nové zápisy do tabulky jsou v době zápisu kontrolovány na kompatibilitu se schématem cílové tabulky. Pokud je schéma nekonzistentní, Delta Lake transakci zcela zruší (nezapisují se žádná data) a vyvolá výjimku, která uživatele informuje o nekonzistenci.
Delta Lake používá k určení, zda je záznam kompatibilní s tabulkou, následující pravidla. Zapsaný datový rámec:

  • nemůže obsahovat další sloupce, které nejsou ve schématu cílové tabulky. Vše je naopak v pořádku, pokud příchozí data neobsahují absolutně všechny sloupce z tabulky – těmto sloupcům budou jednoduše přiřazeny nulové hodnoty.
  • nemůže mít datové typy sloupců, které se liší od datových typů sloupců v cílové tabulce. Pokud sloupec v cílové tabulce obsahuje data StringType, ale odpovídající sloupec v DataFrame obsahuje data IntegerType, vynucení schématu vyvolá výjimku a zabrání provedení operace zápisu.
  • nemůže obsahovat názvy sloupců, které se liší pouze velikostí písmen. To znamená, že nemůžete mít ve stejné tabulce definované sloupce s názvem 'Foo' a 'foo'. Zatímco Spark lze použít v režimu rozlišování malých a velkých písmen nebo bez ohledu na malá a velká písmena (výchozí) režim, Delta Lake zachovává velikost písmen, ale v rámci úložiště schémat nerozlišuje. Parkety při ukládání a vracení informací o sloupcích rozlišují velká a malá písmena. Abychom se vyhnuli možným chybám, poškození dat nebo ztrátě dat (kterou jsme v Databricks osobně zažili), rozhodli jsme se toto omezení přidat.

Abychom to ilustrovali, podívejme se, co se stane v níže uvedeném kódu při pokusu o přidání některých nově vygenerovaných sloupců do tabulky Delta Lake, která ještě není nakonfigurována tak, aby je přijala.

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

Místo automatického přidávání nových sloupců Delta Lake vynucuje schéma a zastaví nahrávání. Aby Spark pomohl určit, který sloupec (nebo jejich sada) způsobuje nesoulad, vybere obě schémata ze zásobníku trasování pro porovnání.

Jaká je výhoda vynucení schématu?

Vzhledem k tomu, že vynucení schématu je poměrně přísná kontrola, je to skvělý nástroj, který lze použít jako správce čisté, plně transformované datové sady, která je připravena k produkci nebo spotřebě. Obvykle se používá pro tabulky, které poskytují data přímo:

  • Algoritmy strojového učení
  • BI dashboardy
  • Nástroje pro analýzu a vizualizaci dat
  • Jakýkoli produkční systém, který vyžaduje vysoce strukturovaná, silně typovaná sémantická schémata.

K přípravě svých dat na tuto poslední překážku mnoho uživatelů používá jednoduchou "multi-hop" architekturu, která postupně zavádí strukturu do jejich tabulek. Chcete-li se o tom dozvědět více, můžete si přečíst článek Strojové učení na úrovni výroby s Delta Lake.

Vynucení schématu lze samozřejmě použít kdekoli ve vašem kanálu, ale mějte na paměti, že streamování zápisu do tabulky může být v tomto případě frustrující, protože jste například zapomněli, že jste k příchozím datům přidali další sloupec.

Prevence ztenčování dat

V tuto chvíli se možná ptáte, proč ten humbuk? Koneckonců, někdy vás může neočekávaná chyba „nesoulad schématu“ podrazit ve vašem pracovním postupu, zvláště pokud jste v Delta Lake noví. Proč nenechat schéma změnit podle potřeby, abych mohl svůj DataFrame zapsat bez ohledu na to, co?

Jak říká staré přísloví: "Unce prevence stojí za libru léčby." V určitém okamžiku, pokud se nebudete starat o vynucení svého schématu, problémy s kompatibilitou datových typů budou mít své ošklivé hlavy – zdánlivě homogenní zdroje nezpracovaných dat mohou obsahovat okrajové případy, nefunkční sloupce, nesprávně tvarovaná mapování nebo jiné obávané věci, o kterých sníte. v nočních můrách. Nejlepším přístupem je zastavit tyto nepřátele u brány – pomocí vynucení schématu – a vypořádat se s nimi ve světle, ne později, když začnou slídit v temných hlubinách vašeho produkčního kódu.

Vynucení schématu vám dává jistotu, že schéma vaší tabulky se nezmění, pokud změnu sami nepotvrdíte. To zabraňuje zředění dat, ke kterému může dojít, když jsou nové sloupce přidávány tak často, že dříve cenné, komprimované tabulky ztrácejí svou hodnotu a užitečnost kvůli zahlcení daty. Tím, že vás vybízí, abyste byli úmyslní, nastavili vysoké standardy a očekávali vysokou kvalitu, vynucování schémat dělá přesně to, k čemu bylo navrženo – pomáhá vám zůstat svědomití a udržovat vaše tabulky čisté.

Pokud se po dalším zvážení rozhodnete, že opravdu nutný přidat nový sloupec - žádný problém, níže je jednořádková oprava. Řešením je vývoj obvodu!

Co je evoluce schématu?

Evoluce schématu je funkce, která uživatelům umožňuje snadno změnit aktuální schéma tabulky tak, aby odpovídalo datům, která se v průběhu času mění. Nejčastěji se používá při provádění operace přidání nebo přepsání k automatickému přizpůsobení schématu tak, aby zahrnovalo jeden nebo více nových sloupců.

Jak evoluce schématu funguje?

Podle příkladu v předchozí části mohou vývojáři snadno použít vývoj schématu k přidání nových sloupců, které byly dříve odmítnuty kvůli nekonzistenci schématu. Vývoj obvodu se aktivuje přidáním .option('mergeSchema', 'true') vašemu týmu Spark .write или .writeStream.

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

Chcete-li zobrazit graf, spusťte následující dotaz 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

Ponořte se do Delta Lake: Vynucení schématu a vývoj
Případně můžete tuto možnost nastavit pro celou relaci Spark přidáním spark.databricks.delta.schema.autoMerge = True do konfigurace Spark. Ale používejte to opatrně, protože vynucení schématu vás již nebude upozorňovat na neúmyslné nekonzistence schématu.

Zahrnutím parametru do požadavku mergeSchema, všechny sloupce, které jsou přítomny v DataFrame, ale nejsou přítomny v cílové tabulce, jsou automaticky přidány na konec schématu jako součást transakce zápisu. Lze také přidat vnořená pole, která budou také přidána na konec odpovídajících sloupců struktury.

Data inženýři a datoví vědci mohou tuto možnost použít k přidání nových sloupců (možná nedávno sledované metriky nebo sloupce s údaji o prodeji za tento měsíc) do svých stávajících produkčních tabulek strojového učení, aniž by narušili stávající modely založené na starých sloupcích.

Následující typy změn schématu jsou povoleny jako součást vývoje schématu, když je přidána nebo přepsána tabulka:

  • Přidání nových sloupců (toto je nejběžnější scénář)
  • Změna datových typů z NullType -> jakýkoli jiný typ nebo povýšení z ByteType -> ShortType -> IntegerType

Jiné změny, které nejsou povoleny jako součást vývoje schématu, vyžadují, aby schéma a data byla přepsána přidáním .option("overwriteSchema", "true"). Například v případě, kdy byl sloupec "Foo" původně celé číslo a nové schéma by bylo datovým typem řetězce, pak by bylo nutné přepsat všechny soubory Parquet(data). Mezi tyto změny patří:

  • smazání sloupce
  • změna datového typu existujícího sloupce (na místě)
  • přejmenování sloupců, které se liší pouze velikostí písmen (například „Foo“ a „Foo“)

Konečně, v příštím vydání Spark 3.0 bude plně podporován explicitní DDL (pomocí ALTER TABLE), což uživatelům umožní provádět následující akce na schématech tabulek:

  • přidávání sloupců
  • změna komentářů sloupců
  • nastavení vlastností tabulky, které určují, jak se tabulka chová, jako je nastavení, jak dlouho bude protokol transakcí uchováván.

Jaká je výhoda evoluce schémat?

Schematický vývoj lze použít kdykoli zamýšlet změňte schéma tabulky (na rozdíl od toho, kdy jste do DataFrame omylem přidali sloupce, které tam být neměly). Toto je nejjednodušší způsob migrace schématu, protože automaticky přidá správné názvy sloupců a datové typy, aniž byste je museli explicitně deklarovat.

Závěr

Vynucení schématu odmítne všechny nové sloupce nebo jiné změny schématu, které nejsou kompatibilní s vaší tabulkou. Stanovením a udržováním těchto vysokých standardů se analytici a inženýři mohou spolehnout na to, že jejich data budou mít nejvyšší úroveň integrity, zdůvodní je jasně a stručně, což jim umožní přijímat lepší obchodní rozhodnutí.

Na druhé straně vývoj schématu doplňuje prosazování zjednodušením domnělý automatické změny schématu. Koneckonců by nemělo být těžké přidat sloupec.

Vynucení schématu je jang, kde vývoj schématu je jin. Při společném použití tyto funkce usnadňují redukci šumu a ladění signálu než kdykoli předtím.

Rádi bychom také poděkovali Mukul Murthy a Pranav Anand za jejich příspěvky k tomuto článku.

Další články z této série:

Ponořte se do Delta Lake: rozbalte protokol transakcí

Související články

Strojové učení na úrovni výroby s Delta Lake

Co je to datové jezero?

Zjistěte více o kurzu

Zdroj: www.habr.com

Přidat komentář