Hi Habr! Bidh mi a’ toirt d’ aire eadar-theangachadh an artaigil le Burak Yavuz, Brenner Heintz agus Denny Lee, a chaidh ullachadh mar ullachadh airson cur air bhog a’ chùrsa bho OTUS.

Bidh dàta, mar ar n-eòlas, a’ cruinneachadh agus ag atharrachadh fad na h-ùine. Gus cumail suas ris, feumaidh ar modalan inntinn den t-saoghal atharrachadh a rèir dàta ùr, agus tha tomhasan ùra ann an cuid dhiubh – dòighean ùra air rudan fhaicinn nach robh fios againn mu dheidhinn roimhe. Chan eil na modalan inntinn seo eu-coltach ris na sgeamaichean ann an duilleagan-clèithe a tha a’ dearbhadh mar a bhios sinn a’ seòrsachadh agus a’ giullachd fiosrachadh ùr.
Tha seo gar toirt gu cùis riaghladh sgeamaichean. Mar a bhios amasan is riatanasan gnìomhachais ag atharrachadh thar ùine, bidh structar an dàta agad ag atharrachadh cuideachd. Bidh Delta Lake ga dhèanamh furasta tomhasan ùra a thoirt a-steach mar a bhios dàta ag atharrachadh. Tha cothrom aig luchd-cleachdaidh air semantics sìmplidh airson na sgeamaichean clàr aca a riaghladh. Tha na h-innealan sin a’ toirt a-steach Schema Enforcement, a dhìonas luchd-cleachdaidh bho bhith a’ lìonadh an cuid chlàran le mearachdan no dàta neo-riatanach gun fhiosta, agus Schema Evolution, a chuireas colbhan ùra ris gu fèin-ghluasadach anns a bheil dàta luachmhor anns na h-àiteachan iomchaidh. San artaigil seo, nì sinn sgrùdadh nas doimhne air cleachdadh nan innealan sin.
A’ tuigsinn sgeamaichean clàr
Tha sgeama anns gach DataFrame ann an Apache Spark a mhìnicheas cruth an dàta, leithid seòrsachan dàta, colbhan, agus meata-dhàta. Le Delta Lake, tha sgeama a’ chlàir air a stòradh ann an cruth JSON taobh a-staigh loga nan gnothaichean.
Dè a th’ ann an cur an gnìomh sgeama?
’S e inneal tèarainteachd ann an Delta Lake a th’ ann an Cur an Gnìomh Sgeama, ris an canar Dearbhadh Sgeama cuideachd, a nì cinnteach à càileachd dàta le bhith a’ diùltadh chlàran nach eil a rèir sgeama a’ chlàir. Coltach ri bean-aoigheachd ann an taigh-bìdh mòr-chòrdte nach gabh ach ri glèidhidhean, bidh Cur an Gnìomh Sgeama a’ sgrùdadh a bheil gach colbh dàta a thèid a chur a-steach don chlàr air liosta co-fhreagarrach de cholbhan ris a bheil dùil (ann am faclan eile, a bheil “glèidheadh” ann airson gach fear) agus a’ diùltadh chlàran sam bith le colbhan nach eil air an liosta.
Ciamar a tha cur an gnìomh sgeama ag obair?
Bidh Delta Lake a’ cleachdadh sgrùdadh sgeama-air-sgrìobhadh, a’ ciallachadh gu bheilear a’ dèanamh cinnteach gu bheil a h-uile sgrìobhadh ùr gu clàr co-chòrdalachd ri sgeama a’ chlàir targaid aig àm sgrìobhaidh. Mura h-eil an sgeama co-chòrdail, cuiridh Delta Lake stad air a’ ghnothach gu tur (chan eil dàta sam bith air a sgrìobhadh) agus cuiridh e eisgeachd air dòigh gus fios a chur chun neach-cleachdaidh mun neo-chunbhalachd.
Bidh Delta Lake a’ cleachdadh nan riaghailtean a leanas gus faighinn a-mach a bheil clàr co-chòrdail ri clàr. Am DataFrame ga sgrìobhadh:
- Chan fhaod e colbhan a bharrachd a bhith ann nach eil an làthair ann an sgeama a’ chlàir targaid. Air an làimh eile, tha e ceart gu leòr mura h-eil gach colbh bhon chlàr anns an dàta a tha a’ tighinn a-steach—thèid luachan neoni a shònrachadh dha na colbhan sin.
- chan urrainn dha seòrsachan dàta colbh a bhith ann a tha eadar-dhealaichte bho na seòrsachan dàta colbh anns a’ chlàr targaid. Ma tha dàta StringType ann an colbh anns a’ chlàr targaid, ach ma tha dàta IntegerType anns a’ cholbh co-fhreagarrach anns an DataFrame, tilgidh cur an gnìomh sgeama eisgeachd agus cuiridh e casg air an obair sgrìobhaidh bho bhith a’ tachairt.
- chan urrainn dha ainmean colbh a bhith ann a tha eadar-dhealaichte ann an cùis a-mhàin. Tha seo a’ ciallachadh nach urrainn dhut colbhan leis an ainm ‘Foo’ agus ‘foo’ a bhith agad air am mìneachadh san aon chlàr. Ged a ghabhas Spark a chleachdadh ann an dòigh mothachail air cùis no neo-mhothachail air cùis (gu gnàthach), bidh Delta Lake a’ gleidheadh cùis ach neo-mhothachail air cùis nuair a bhios e a’ stòradh sgeama. Tha Parquet mothachail air cùis nuair a bhios e a’ stòradh agus a’ faighinn air ais fiosrachadh colbh. Gus mearachdan a dh’ fhaodadh a bhith ann, coirbeachd dàta no call dàta a sheachnadh (rud a tha sinn air eòlas fhaighinn air gu pearsanta aig Databricks), chuir sinn romhainn an cuingealachadh seo a chur ris.
Gus seo a mhìneachadh, leig dhuinn sùil a thoirt air na thachras anns a’ chòd gu h-ìosal nuair a dh’fheuchas sinn ri cuid de cholbhan a chaidh a chruthachadh às ùr a chur ri clàr Delta Lake nach eil air a rèiteachadh fhathast gus gabhail riutha.
# Сгенерируем 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.An àite colbhan ùra a chur ris gu fèin-ghluasadach, bidh Delta Lake a’ cur sgeama an gnìomh agus a’ stad sgrìobhadh. Gus cuideachadh le bhith a’ dearbhadh dè an colbh (no seataichean de cholbhan) a tha ag adhbhrachadh an eadar-dhealachaidh, bidh Spark a’ taisbeanadh an dà sgeama bhon lorg cruach airson coimeas.
Dè a’ bhuannachd a tha ann a bhith a’ cur an sgeama an gnìomh?
Leis gur e sgrùdadh gu math teann a th’ ann an cur an gnìomh sgeama, ’s e inneal sàr-mhath a th’ ann airson a chleachdadh mar gheata-dìon gu seata dàta glan, làn-atharraichte deiseil airson cinneasachadh no caitheamh. Mar as trice, bidh e air a chur an sàs ann an clàran a bhios a’ biathadh dàta gu dìreach:
- Algairim ionnsachaidh innealan
- Deas-bhòrd BI
- Innealan anailis dàta agus lèirsinn
- Siostam cinneasachaidh sam bith a dh’ fheumas sgeamaichean brìghmhor le structar teann, air an clò-sgrìobhadh gu teann.
Gus an dàta aca ullachadh airson a’ chnap-starra mu dheireadh seo, bidh mòran de luchd-cleachdaidh a’ cleachdadh ailtireachd shìmplidh “ioma-hop” a bhios mean air mhean a’ toirt structar a-steach do na clàran aca. Airson tuilleadh fiosrachaidh, faodaidh tu an artaigil a leughadh
Gu dearbh, faodaidh tu cur an gnìomh sgeama a chleachdadh an àite sam bith sa phìob-loidhne agad, ach cuimhnich gum faod sgrìobhadh gu clàr sa chùis seo a bhith duilich, mar eisimpleir, leis gun do dhìochuimhnich thu gun do chuir thu colbh eile ris an dàta a bha a’ tighinn a-steach.
A’ cur casg air leaghadh dàta
Aig an ìre seo, is dòcha gu bheil thu a’ faighneachd dè a tha an t-uabhas seo uile mu dheidhinn? Às dèidh a h-uile càil, uaireannan faodaidh mearachd ris nach robh dùil “mearachd sgeama mì-chothromach” do chur fo thuil nad shruth-obrach, gu h-àraidh ma tha thu ùr do Delta Lake. Carson nach leig thu leis an sgeama atharrachadh mar a dh’ fheumar gus an urrainn dhomh mo DataFrame a sgrìobhadh ge bith dè?
Mar a chanas an seanfhacal, “is fhiach unnsa de chasg punnd de leigheas.” Aig àm air choreigin, mura dèan thu cinnteach gun cuir thu an sgeama agad an gnìomh, nochdaidh cùisean co-chòrdalachd seòrsa dàta - dh’ fhaodadh gum bi cùisean oir, colbhan coirbte, mapaichean mì-chruthaichte, no trom-laighe eile ann an stòran dàta amh a tha coltach ri aon-ghnèitheach. Is e an dòigh-obrach as fheàrr stad a chuir air na nàimhdean sin aig a’ gheata - le bhith a’ cur an gnìomh sgeama - agus dèiligeadh riutha san fhosgailte, seach nas fhaide air adhart, nuair a thòisicheas iad a’ falach ann an doimhneachdan dorcha do chòd riochdachaidh.
Bidh cur an gnìomh sgeama a’ dèanamh cinnteach nach atharraich sgeama do chlàir mura h-eil thu gu soilleir ag aontachadh ris an atharrachadh. Tha seo a’ cur casg air lagachadh dàta, rud a dh’ fhaodadh tachairt nuair a thèid colbhan ùra a chur ris cho tric is gun caill clàran a bha roimhe seo luachmhor agus dlùth an ciall agus an fheumalachd air sgàth tuil dàta. Le bhith gad bhrosnachadh gus a bhith rùnach, ìrean àrda a shuidheachadh, agus càileachd àrd a bhith an dùil, bidh cur an gnìomh sgeama a’ dèanamh dìreach na bha e an dùil a dhèanamh - gad chuideachadh le bhith a’ cumail ionracas agus a’ cumail do chlàran glan.
Ma cho-dhùnas tu às dèidh tuilleadh beachdachadh gu bheil thu dha-rìribh ga dhèanamh feum Chan eil e na dhuilgheadas colbh ùr a chur ris; tha fuasgladh aon-loidhne ri fhaighinn gu h-ìosal. Is e mean-fhàs sgeama am fuasgladh!
Dè a th' ann an mean-fhàs sgeama?
’S e feart a th’ ann an mean-fhàs sgeama a leigeas le luchd-cleachdaidh sgeama làithreach clàir atharrachadh gu furasta gus freagairt air dàta a tha ag atharrachadh thar ùine. ’S e rud as cumanta a thathas ga chleachdadh rè obrachaidhean cuir a-steach no ath-sgrìobhaidh gus an sgeama atharrachadh gu fèin-ghluasadach gus aon no barrachd cholbhan ùra a thoirt a-steach.
Ciamar a tha mean-fhàs sgeama ag obair?
A’ leantainn an eisimpleir bhon earrann roimhe, faodaidh luchd-leasachaidh mean-fhàs sgeama a chleachdadh gu furasta gus colbhan ùra a chur ris a chaidh a dhiùltadh roimhe air sgàth neo-ghèilleadh sgeama. Tha mean-fhàs sgeama air a ghnìomhachadh le bhith a’ cur ris .option('mergeSchema', 'true') don sgioba Spark agad .write или .writeStream.
# Добавьте параметр mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)Gus am graf fhaicinn, ruith an ceist Spark SQL a leanas
# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10 
Air neo, faodaidh tu an roghainn seo a shuidheachadh airson seisean Spark gu lèir le bhith a’ cur ris spark.databricks.delta.schema.autoMerge = True a-steach do rèiteachadh Spark. Ach, cleachd seo gu faiceallach, oir cha toir cur an gnìomh sgeama rabhadh dhut tuilleadh mu neo-chunbhalachdan sgeama gun fhiosta.
Le bhith a’ cur paramadair san iarrtas mergeSchemaThèid a h-uile colbh a tha an làthair anns an DataFrame ach a tha a dhìth bhon chlàr targaid a chur ris an sgeama gu fèin-ghluasadach rè an targaid sgrìobhaidh. Faodar raointean neadaichte a chur ris cuideachd, agus thèid an cur ris na colbhan co-fhreagarrach san structar cuideachd.
Faodaidh innleadairean dàta agus luchd-saidheans an roghainn seo a chleachdadh gus colbhan ùra (’s dòcha meatrach a chaidh a leantainn o chionn ghoirid no colbh de fhigearan reic airson a’ mhìos seo) a chur ris na clàran cinneasachaidh ionnsachaidh innealan a th’ aca mu thràth gun mhodalan a th’ ann mar-thà stèidhichte air na seann cholbhan a bhriseadh.
Tha na seòrsaichean atharrachaidhean sgeama a leanas ceadaichte mar phàirt de leasachadh sgeama rè cuir a-steach no ath-sgrìobhadh chlàran:
- A’ cur colbhan ùra ris (is e seo an suidheachadh as cumanta)
- Ag atharrachadh seòrsachan dàta bho NullType -> seòrsa sam bith eile no ag adhartachadh bho ByteType -> ShortType -> IntegerType
Feumaidh atharrachaidhean eile nach eil ceadaichte taobh a-staigh mean-fhàs sgeama gun tèid an sgeama agus an dàta a sgrìobhadh thairis le bhith gan cur ris .option("overwriteSchema", "true")Mar eisimpleir, ma bha an colbh "Foo" na shlàn-àireamh an toiseach, agus an sgeama ùr na sheòrsa dàta sreang, bhiodh feum air na faidhlichean Parquet (dàta) uile ath-sgrìobhadh. Tha atharrachaidhean mar seo a’ gabhail a-steach:
- a’ sguabadh às colbh
- ag atharrachadh seòrsa dàta colbh a tha ann mar-thà (na àite)
- ath-ainmeachadh cholbhan aig a bheil eadar-dhealachadh a-mhàin ann an cùis (m.e. "Foo" agus "foo")
Mu dheireadh, leis an ath fhoillseachadh, Spark 3.0, bidh làn thaic ri DDL soilleir (a’ cleachdadh ALTER TABLE), a’ leigeil le luchd-cleachdaidh na gnìomhan a leanas a dhèanamh air sgeamaichean clàir:
- a’ cur cholbhan ris
- ag atharrachadh bheachdan colbh
- A’ suidheachadh fheartan clàir a dh’innseas mar a bhios an clàr ag obair, leithid a bhith a’ suidheachadh ùine gleidhidh loga nan gnothaichean.
Dè a’ bhuannachd a tha ann an leasachadh sgeama?
Faodar mean-fhàs sgeama a chleachdadh uair sam bith a nì thu a bheil thu an dùil Atharraich sgeama do chlàir (an taca ri bhith a’ cur cholbhan ris an DataFrame agad gun fhiosta nach bu chòir a bhith ann). Is e seo an dòigh as fhasa air an sgeama agad a ghluasad oir cuiridh e ainmean nan colbhan agus na seòrsaichean dàta ceart ris gu fèin-ghluasadach gun a bhith gan ainmeachadh gu soilleir.
co-dhùnadh
Bidh cur an gnìomh sgeama a’ diùltadh colbhan ùra no atharrachaidhean sgeama eile nach eil co-chòrdail ris a’ chlàr agad. Le bhith a’ suidheachadh agus a’ cumail suas nan ìrean àrda seo, faodaidh luchd-anailis agus innleadairean a bhith misneachail gu bheil an ìre as àirde de ionracas aig an dàta aca, a’ reusanachadh mu dheidhinn gu soilleir agus gu pongail, a’ toirt cothrom dhaibh co-dhùnaidhean gnìomhachais nas èifeachdaiche a dhèanamh.
Air an làimh eile, tha mean-fhàs na sgeama a’ cur ri cur an gnìomh le bhith a’ sìmpleachadh fo chasaid Atharrachaidhean sgeama fèin-ghluasadach. Às dèidh a h-uile càil, cha bu chòir dha a bhith cho doirbh colbh a chur ris.
’S e cur an gnìomh chuairtean an yang gu yin mean-fhàs chuairtean. Nuair a thèid na feartan seo a chleachdadh còmhla, tha e nas fhasa na bha e a-riamh fuaim a chasg agus comharran a thionndadh.
Bu mhath leinn cuideachd taing a thoirt do Mukul Murthy agus Pranav Anand airson na chuir iad ris an artaigil seo.
Artaigilean eile san t-sreath seo:

Artaigilean co-cheangailte
Source: www.habr.com
