Delta Lake Dive: Imudaniloju ati Itankalẹ Ero

Kaabo, Habr! Mo ṣafihan itumọ nkan naa si akiyesi rẹ "Disomi sinu adagun Delta: Imudaniloju Ero & Itankalẹ" awọn onkọwe Burak Yavuz, Brenner Heintz ati Denny Lee, eyiti a pese sile ni ifojusona ti ibẹrẹ iṣẹ ikẹkọ naa. Data ẹlẹrọ lati OTUS.

Delta Lake Dive: Imudaniloju ati Itankalẹ Ero

Data, bii iriri wa, n ṣajọpọ nigbagbogbo ati idagbasoke. Lati tẹsiwaju, awọn awoṣe ọpọlọ wa ti agbaye gbọdọ ṣe deede si data tuntun, diẹ ninu eyiti o ni awọn iwọn tuntun ninu — awọn ọna tuntun ti wiwo awọn nkan ti a ko ni imọran tẹlẹ. Awọn awoṣe opolo wọnyi ko yatọ pupọ si awọn eto tabili ti o pinnu bi a ṣe ṣe tito lẹtọ ati ilana alaye tuntun.

Eyi mu wa wá si ọran ti iṣakoso ero. Bii awọn italaya iṣowo ati awọn ibeere ṣe yipada ni akoko pupọ, bakanna ni eto data rẹ. Delta Lake jẹ ki o rọrun lati ṣafihan awọn wiwọn tuntun bi awọn iyipada data. Awọn olumulo ni aye si awọn atunmọ ti o rọrun lati ṣakoso awọn eto tabili wọn. Awọn irinṣẹ wọnyi pẹlu Imudaniloju Iṣeto, eyiti o ṣe aabo fun awọn olumulo lati aimọkan idoti awọn tabili wọn pẹlu awọn aṣiṣe tabi data ti ko wulo, ati Itankalẹ Schema, eyiti o fun laaye awọn ọwọn tuntun ti data ti o niyelori lati ṣafikun laifọwọyi si awọn ipo ti o yẹ. Ninu nkan yii, a yoo jinlẹ jinlẹ si lilo awọn irinṣẹ wọnyi.

Oye Table Siso

DataFrame kọọkan ni Apache Spark ni ero kan ti o ṣe alaye fọọmu ti data, gẹgẹbi awọn iru data, awọn ọwọn, ati metadata. Pẹlu Delta Lake, eto tabili ti wa ni ipamọ ni ọna kika JSON inu iwe iṣowo naa.

Kini imuse eto?

Imudaniloju Iṣeto, ti a tun mọ ni Ifọwọsi Schema, jẹ ẹrọ aabo ni adagun Delta ti o ṣe idaniloju didara data nipa kikọsilẹ awọn igbasilẹ ti ko baamu ero tabili naa. Gẹgẹbi agbalejo ni tabili iwaju ti ile ounjẹ ifiṣura olokiki-nikan, o ṣayẹwo boya iwe kọọkan ti data ti o wọ inu tabili wa ninu atokọ ti o baamu ti awọn ọwọn ti a nireti (ni awọn ọrọ miiran, boya “ifiṣura” wa fun ọkọọkan wọn. ), ati kọ awọn igbasilẹ eyikeyi pẹlu awọn ọwọn ti ko si ninu atokọ naa.

Bawo ni imuse eto siseto?

Delta Lake nlo iṣayẹwo eto-lori-kikọ, eyiti o tumọ si pe gbogbo awọn kikọ tuntun si tabili ni a ṣayẹwo fun ibaramu pẹlu ero tabili ibi-afẹde ni akoko kikọ. Ti ero naa ko ba ni ibamu, Delta Lake fagilee idunadura naa patapata (ko si data ti a kọ) ati gbejade iyasọtọ lati fi to olumulo leti ti aisedede naa.
Delta Lake nlo awọn ofin wọnyi lati pinnu boya igbasilẹ kan ni ibamu pẹlu tabili kan. Fireemu Data ti a le kọ:

  • ko le ni afikun awọn ọwọn ti ko si ni ero tabili ibi-afẹde. Lọna miiran, ohun gbogbo dara ti data ti nwọle ko ba ni Egba gbogbo awọn ọwọn lati tabili - awọn ọwọn wọnyi yoo rọrun ni sọtọ awọn iye asan.
  • ko le ni awọn iru data iwe ti o yatọ si awọn oriṣi data ti awọn ọwọn ninu tabili ibi-afẹde. Ti o ba jẹ pe iwe tabili ibi-afẹde ni data StringType, ṣugbọn iwe ti o baamu ninu DataFrame ni data IntegerType ninu, imuṣeduro ero-iṣe yoo jabọ imukuro ati ṣe idiwọ iṣẹ kikọ lati waye.
  • ko le ni awọn orukọ ọwọn ti o yatọ nikan ni irú. Eyi tumọ si pe o ko le ni awọn ọwọn ti a npè ni 'Foo' ati 'foo' ni asọye ni tabili kanna. Lakoko ti Spark le ṣee lo ni ipo-ifamọ tabi ọran-aibikita (aiyipada), Delta Lake jẹ itọju ọran ṣugbọn o jẹ aibikita laarin ibi ipamọ ero. Parquet jẹ ifarabalẹ ọran nigbati o fipamọ ati da alaye ọwọn pada. Lati yago fun awọn aṣiṣe ti o ṣeeṣe, ibajẹ data, tabi pipadanu data (nkankan ti a ni iriri tikalararẹ ni Databricks), a pinnu lati ṣafikun aropin yii.

Lati ṣapejuwe eyi, jẹ ki a wo ohun ti o ṣẹlẹ ninu koodu ti o wa ni isalẹ nigba ti a gbiyanju lati ṣafikun diẹ ninu awọn ọwọn tuntun ti ipilẹṣẹ si tabili Delta Lake ti ko ti tunto lati gba wọn.

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

Dipo fifi awọn ọwọn tuntun kun laifọwọyi, Delta Lake fi eto kan han ati da kikọ duro. Lati ṣe iranlọwọ lati pinnu iru ọwọn (tabi ṣeto awọn ọwọn) ti o nfa aiṣedeede naa, Spark ṣe agbejade awọn eto mejeeji lati itọpa akopọ fun lafiwe.

Kini anfani ti imuse ilana kan?

Nitori imuse eto eto jẹ ayẹwo ti o muna to muna, o jẹ ohun elo ti o tayọ lati lo bi olutọju ẹnu-ọna si mimọ, ṣeto data ti o yipada ni kikun ti o ṣetan fun iṣelọpọ tabi agbara. Nigbagbogbo loo si awọn tabili ti o jẹ data taara:

  • Awọn algorithms ẹkọ ẹrọ
  • BI dasibodu
  • Awọn atupale data ati awọn irinṣẹ iworan
  • Eyikeyi eto iṣelọpọ ti o nilo eto ti o ga julọ, awọn eto atunmọ titẹ ni agbara.

Lati mura data wọn fun idiwọ ikẹhin yii, ọpọlọpọ awọn olumulo lo “ọpọlọpọ-hop” faaji ti o rọrun ti o ṣafihan igbekalẹ sinu awọn tabili wọn. Lati ni imọ siwaju sii nipa eyi, o le ṣayẹwo nkan naa Isejade-ite ẹrọ eko pẹlu Delta Lake.

Nitoribẹẹ, imuse eto eto le ṣee lo nibikibi ninu opo gigun ti epo rẹ, ṣugbọn ranti pe ṣiṣanwọle si tabili kan ninu ọran yii le jẹ idiwọ nitori, fun apẹẹrẹ, o gbagbe pe o ṣafikun iwe miiran si data ti nwọle.

Idilọwọ dilution data

Nipa bayi o le ṣe iyalẹnu, kini gbogbo ariwo nipa? Lẹhinna, nigbakan aṣiṣe “aiṣedeede eto” airotẹlẹ le ja ọ soke ninu ṣiṣiṣẹsẹhin rẹ, ni pataki ti o ba jẹ tuntun si Delta Lake. Kilode ti kii ṣe jẹ ki ero naa yipada bi o ṣe nilo ki MO le kọ DataFrame mi laibikita kini?

Gẹ́gẹ́ bí ọ̀rọ̀ àtijọ́ ṣe sọ, “ìyẹn ìdènà kan tọ́ sí ìwòsàn ìwọ̀n kan.” Ni aaye kan, ti o ko ba ṣe akiyesi lati fi ipa mu ero rẹ, iru awọn ọran ibamu iru data yoo gbe awọn ori wọn buruju - o dabi ẹnipe awọn orisun data isokan le ni awọn ọran eti, awọn ọwọn ibajẹ, awọn maapu aiṣedeede, tabi awọn ohun ibanilẹru miiran lati la nipa ninu alaburuku. Ọna ti o dara julọ ni lati da awọn ọta wọnyi duro ni ẹnu-bode - pẹlu imuse ero - ati koju wọn ni ina, kuku ju nigbamii nigbati wọn bẹrẹ si farapamọ sinu awọn ijinle dudu ti koodu iṣelọpọ rẹ.

Gbigbe eto kan fun ọ ni idaniloju pe ero tabili rẹ kii yoo yipada ayafi ti o ba fọwọsi iyipada naa. Eyi ṣe idiwọ dilution data, eyiti o le waye nigbati awọn ọwọn tuntun ba ṣafikun nigbagbogbo ti o niyelori tẹlẹ, awọn tabili fisinuirindigbindigbin padanu itumọ wọn ati iwulo nitori inundation data. Nipa fifun ọ ni iyanju lati jẹ aniyan, ṣeto awọn iṣedede giga, ati nireti didara giga, imuṣiṣẹ ero ṣe deede ohun ti a ṣe apẹrẹ lati ṣe — ṣe iranlọwọ fun ọ lati wa ni itara ati mimọ awọn iwe kaakiri rẹ.

Ti o ba ṣe akiyesi siwaju sii o pinnu pe o gaan nilo fi titun kan iwe - ko si isoro, ni isalẹ ni a ọkan-ila fix. Ojutu ni itankalẹ ti Circuit!

Kini itankalẹ eto eto?

Itankalẹ Schema jẹ ẹya ti o fun laaye awọn olumulo lati ni irọrun yi ero tabili lọwọlọwọ ni ibamu si data ti o yipada ni akoko pupọ. A maa n lo nigbagbogbo nigbati o ba n ṣe ohun elo kan tabi iṣẹ atunkọ lati ṣe adaṣe eto laifọwọyi lati ni ọkan tabi diẹ sii awọn ọwọn tuntun.

Bawo ni itankalẹ schema ṣiṣẹ?

Ni atẹle apẹẹrẹ lati apakan ti tẹlẹ, awọn olupilẹṣẹ le ni irọrun lo itankalẹ apẹrẹ lati ṣafikun awọn ọwọn tuntun ti a kọ tẹlẹ nitori aiṣedeede ero. Itankalẹ Circuit wa ni mu ṣiṣẹ nipa fifi .option('mergeSchema', 'true') si ẹgbẹ Spark rẹ .write или .writeStream.

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

Lati wo awonya naa, ṣiṣe ibeere Spark SQL atẹle yii

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

Delta Lake Dive: Imudaniloju ati Itankalẹ Ero
Ni omiiran, o le ṣeto aṣayan yii fun gbogbo igba Spark nipa fifi kun spark.databricks.delta.schema.autoMerge = True to Spark iṣeto ni. Ṣugbọn lo eyi pẹlu iṣọra, nitori imuse eto eto kii yoo ṣe akiyesi ọ si awọn aiṣedeede ero airotẹlẹ.

Nipa pẹlu paramita ninu ibeere naa mergeSchema, gbogbo awọn ọwọn ti o wa ninu DataFrame ṣugbọn kii ṣe ni tabili ibi-afẹde ni a fi kun laifọwọyi si opin ero-ọrọ gẹgẹbi apakan ti idunadura kikọ. Awọn aaye itẹ-ẹiyẹ tun le ṣafikun ati pe iwọnyi yoo tun ṣafikun si ipari awọn ọwọn eto ti o baamu.

Awọn onimọ-ẹrọ ọjọ ati awọn onimọ-jinlẹ data le lo aṣayan yii lati ṣafikun awọn ọwọn tuntun (boya metric ti a tọpa laipẹ tabi iwe iṣẹ ṣiṣe ti oṣu yii) si awọn tabili iṣelọpọ ẹrọ ti wọn wa tẹlẹ laisi fifọ awọn awoṣe ti o wa ti o da lori awọn ọwọn atijọ.

Awọn oriṣi atẹle ti awọn iyipada ero ni a gba laaye gẹgẹbi apakan ti itankalẹ ero-ọrọ lakoko afikun tabili tabi tunkọ:

  • Ṣafikun awọn ọwọn tuntun (eyi ni oju iṣẹlẹ ti o wọpọ julọ)
  • Yiyipada awọn iru data lati NullType -> iru eyikeyi miiran tabi igbega lati ByteType -> ShortType -> IntegerType

Awọn iyipada miiran ti a ko gba laaye laarin itankalẹ ero-ọrọ nilo pe eto ati data jẹ atunko nipasẹ fifi kun .option("overwriteSchema", "true"). Fun apẹẹrẹ, ninu ọran nibiti iwe “Foo” ti jẹ odidi akọkọ ati pe eto tuntun jẹ iru data okun, lẹhinna gbogbo awọn faili Parquet(data) yoo nilo lati tun kọ. Iru awọn iyipada pẹlu:

  • piparẹ a iwe
  • yiyipada iru data ti iwe ti o wa tẹlẹ (ni ibi)
  • lorukọ awọn ọwọn ti o yatọ nikan ni ọran (fun apẹẹrẹ, "Foo" ati "foo")

Ni ipari, pẹlu itusilẹ atẹle ti Spark 3.0, DDL ti o fojuhan yoo ni atilẹyin ni kikun (lilo ALTER TABLE), gbigba awọn olumulo laaye lati ṣe awọn iṣe wọnyi lori awọn eto tabili:

  • fifi ọwọn
  • iyipada ọwọn comments
  • eto awọn ohun-ini tabili ti o pinnu ihuwasi tabili, gẹgẹbi ṣeto ipari akoko ti akọọlẹ idunadura kan ti fipamọ.

Kini anfani ti itankalẹ ayika?

Itankalẹ Schema le ṣee lo nigbakugba ti o ba pinnu yi eto tabili rẹ pada (ni idakeji si nigbati o ba ṣafikun awọn ọwọn lairotẹlẹ si DataFrame rẹ ti ko yẹ ki o wa nibẹ). Eyi ni ọna ti o rọrun julọ lati lọ si ero rẹ nitori pe o ṣafikun awọn orukọ ọwọn ti o pe ati awọn iru data laisi nini lati sọ wọn ni gbangba.

ipari

Imudaniloju eto kọ eyikeyi awọn ọwọn tuntun tabi awọn ayipada ero miiran ti ko ni ibamu pẹlu tabili rẹ. Nipa tito ati mimu awọn iṣedede giga wọnyi, awọn atunnkanka ati awọn onimọ-ẹrọ le gbẹkẹle pe data wọn ni ipele ti o ga julọ ti iduroṣinṣin, sisọ ni gbangba ati ni gbangba, gbigba wọn laaye lati ṣe awọn ipinnu iṣowo to dara julọ.

Ni ida keji, itankalẹ eto-ọrọ ṣe afikun imuṣiṣẹ nipasẹ dirọrun ẹsun awọn ayipada eto eto aifọwọyi. Lẹhinna, ko yẹ ki o nira lati ṣafikun iwe kan.

Ohun elo ti a fi agbara mu ti ero naa jẹ yang, nibiti itankalẹ ti ero naa jẹ yin. Nigbati a ba lo papọ, awọn ẹya wọnyi jẹ ki ariwo ariwo ati yiyi ifihan rọrun ju lailai.

A tun fẹ lati dupẹ lọwọ Mukul Murthy ati Pranav Anand fun awọn ilowosi wọn si nkan yii.

Awọn nkan miiran ninu jara yii:

Besomi sinu Delta Lake: Unpacking Log Idunadura

jẹmọ Ìwé

Isejade-ite ẹrọ eko pẹlu Delta Lake

Kini adagun data?

Wa diẹ sii nipa ẹkọ naa

orisun: www.habr.com

Fi ọrọìwòye kun