Delta Lake Dive: mmanye na mgbanwe atụmatụ

Hey Habr! M na-egosi gị ntụgharị asụsụ nke akụkọ ahụ "Nbanye n'ime ọdọ mmiri Delta: Mmanye atụmatụ na mgbanwe" ndị edemede Burak Yavuz, Brenner Heintz na Denny Lee, bụ ndị a kwadebere na atụmanya mmalite nke usoro mmụta ahụ. Onye injinia data sitere na OTUS.

Delta Lake Dive: mmanye na mgbanwe atụmatụ

Data, dị ka ahụmịhe anyị, na-agbakọta ma na-agbanwe mgbe niile. Iji nọgide na-aga n'ihu, ụdị echiche anyị nke ụwa aghaghị ime mgbanwe na data ọhụrụ, nke ụfọdụ n'ime ha nwere akụkụ ọhụrụ-ụzọ ọhụrụ nke ikiri ihe ndị anyị na-amaghị na mbụ. Ụdị echiche ndị a adịghị nnọọ iche na schemas nke na-ekpebi ka anyị si ahazi na ịhazi ozi ọhụrụ.

Nke a na-ewetara anyị okwu gbasara njikwa schema. Ka ihe ịma aka azụmahịa na ihe ndị chọrọ na-agbanwe ka oge na-aga, otu ahụ ka nhazi data gị na-agbanwe. Ọdọ mmiri Delta na-eme ka ọ dị mfe iwebata nha ọhụrụ ka mgbanwe data. Ndị ọrụ nwere ohere mmụta mmụta dị mfe iji jikwaa schema tebụl ha. Ngwá ọrụ ndị a gụnyere Schema Enforcement, nke na-echebe ndị ọrụ ka ha ghara imetọ tebụl ha n'amaghị ama na njehie ma ọ bụ data na-adịghị mkpa, na Schema Evolution, nke na-enye ohere ka agbakwunye ogidi ọhụrụ nke data bara uru na-akpaghị aka na ebe kwesịrị ekwesị. N'isiokwu a, anyị ga-abanyekwu n'ime iji ngwaọrụ ndị a.

Ịghọta Atụmatụ Tebụl

DataFrame ọ bụla dị na Apache Spark nwere schema nke na-akọwa ụdị data ahụ, dị ka ụdị data, kọlụm, na metadata. Site na Delta Lake, a na-echekwa atụmatụ tebụl n'ụdị JSON n'ime ndekọ azụmahịa.

Kedu ihe bụ mmanye atụmatụ?

Mkpebi Schema, nke a makwaara dị ka Schema Validation, bụ usoro nchekwa na Delta Lake na-ahụ maka ịdịmma data site n'ịjụ ndekọ na-adabaghị na atụmatụ tebụl. Dị ka onye nnabata nọ n'ihu oche nke ụlọ oriri na ọṅụṅụ naanị ndoputa a ma ama, ọ na-enyocha ma kọlụm data ọ bụla banyere na tebụl dị na ndepụta nke kọlụm ndị a tụrụ anya ya (ya bụ, ma enwere "ndokwa" maka onye ọ bụla n'ime ha). ), ma jụ ndekọ ọ bụla nwere ogidi ndị na-adịghị na ndepụta ahụ.

Kedu ka mmanye schema si arụ ọrụ?

Ọdọ mmiri Delta na-eji nyocha schema-na-dere, nke pụtara na a na-enyocha ihe ọhụrụ niile edere na tebụl maka ndakọrịta na atụmatụ tebụl ebumnuche n'oge ederede. Ọ bụrụ na atụmatụ ahụ adabaghị, Delta Lake kwụsịrị azụmahịa ahụ kpamkpam (enweghị data edere) wee wepụta ihe dị iche iji gwa onye ọrụ maka enweghị nkwekọrịta ahụ.
Ọdọ mmiri Delta na-eji iwu ndị a iji chọpụta ma ndekọ ọ dakọtara na tebụl. DataFrame enwere ike ede:

  • enweghị ike ịnwe ogidi ndị ọzọ na-anọghị na atụmatụ tebụl ebumnuche. N'aka nke ọzọ, ihe niile dị mma ma ọ bụrụ na data na-abata enweghị ogidi niile sitere na tebụl - a ga-ekenye kọlụm ndị a naanị ụkpụrụ efu.
  • enweghị ike ịnwe ụdị data kọlụm dị iche na ụdị data nke kọlụm dị na tebụl ebumnuche. Ọ bụrụ na kọlụm okpokoro ebumnuche nwere data StringType, mana kọlụm kwekọrọ na DataFrame nwere data IntegerType, mmanye atụmatụ ga-atụfu ihe wezuga ma gbochie ọrụ ide ihe na-eme.
  • enweghị ike ịnwe aha kọlụm dị iche naanị ma ọ bụrụ. Nke a pụtara na ịnweghị ike ịnwe kọlụm aha ya bụ 'Foo' na 'foo' n'otu tebụl. Ọ bụ ezie na enwere ike iji Spark mee ihe n'ọnọdụ enweghị mmetụta ma ọ bụ enweghị mmetụta (nke ndabara), Delta Lake na-echekwa ikpe mana ọ naghị enwe mmetụta na nchekwa atụmatụ. Parquet na-enwe mmetụta nke ọma mgbe ị na-echekwa ma na-eweghachi ozi kọlụm. Iji zere mmejọ enwere ike, nrụrụ data, ma ọ bụ mfu data (ihe anyị nwetara n'onwe anyị na Databrick), anyị kpebiri itinye mmachi a.

Iji gosi nke a, ka anyị leba anya n'ihe na-eme na koodu dị n'okpuru ebe a mgbe anyị na-agbalị itinye ụfọdụ ogidi emepụtara ọhụrụ na tebụl Delta Lake nke na-ahazibeghị ịnakwere ha.

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

Kama ịgbakwunye kọlụm ọhụrụ na-akpaghị aka, Delta Lake na-etinye atụmatụ wee kwụsị ide. Iji nyere aka chọpụta kọlụm (ma ọ bụ nhazi nke kọlụm) na-akpata esemokwu ahụ, Spark na-ewepụta atụmatụ abụọ ahụ site na nchịkọta nchịkọta maka ntụnyere.

Kedu uru ọ dị n'ịmanye atụmatụ?

N'ihi na mmanye schema bụ nlele siri ike nke ọma, ọ bụ ngwá ọrụ magburu onwe ya iji dị ka onye nche ọnụ ụzọ iji nweta nhazi data dị ọcha, gbanwere nke ọma nke dị njikere maka mmepụta ma ọ bụ oriri. A na-etinyekarị na tebụl na-enye data ozugbo:

  • Algọridim mmụta igwe
  • Bụ dashboards
  • Ngwa nyocha data na nleba anya
  • Sistemụ mmepụta ọ bụla nke chọrọ nhazi nke ukwuu, atụmatụ semantic pịnye siri ike.

Iji kwadebe data ha maka ihe mgbochi ikpeazụ a, ọtụtụ ndị ọrụ na-eji ihe owuwu "multi-hop" dị mfe nke na-ewebata nhazi n'ime tebụl ha. Iji mụtakwuo banyere nke a, ị nwere ike ịlele akụkọ ahụ Ọmụmụ igwe-ọkwa mmepụta na Delta Lake.

N'ezie, enwere ike iji mmanye schema mee ihe n'ebe ọ bụla na pipeline gị, ma cheta na ịkwanye na tebụl na nke a nwere ike ịkụda mmụọ n'ihi na, dịka ọmụmaatụ, ị chefuru na ị gbakwunyere kọlụm ọzọ na data na-abata.

Na-egbochi dilution data

Ka ọ dị ugbu a, ị nwere ike ịnọ na-eche, kedu ihe na-agbakasị ahụ? A sị ka e kwuwe, mgbe ụfọdụ, njehie "schema mismatch" na-atụghị anya ya nwere ike ime ka ị daa n'usoro ọrụ gị, karịsịa ma ọ bụrụ na ị bụ onye ọhụrụ na Delta Lake. Kedu ihe kpatara na ị gaghị ekwe ka atụmatụ ahụ gbanwee dịka ọ dị mkpa ka m wee dee DataFrame m n'agbanyeghị ihe ọ bụla?

Dị ka okwu ochie na-ekwu, "otu ounce mgbochi kwesịrị otu paụnd ọgwụgwọ." N'oge ụfọdụ, ọ bụrụ na ị kpacharaghị anya ịmanye atụmatụ gị, ụdị ndakọrịta data ga-ebulite isi ha jọgburu onwe ya - nke yiri ka isi mmalite data raw nwere ike ịnwe ikpe ihu, ogidi mebiri emebi, eserese na-adịghị mma, ma ọ bụ ihe ndị ọzọ na-atụ egwu ị ga-arọ nrọ banyere ya. nro. Ụzọ kachasị mma bụ ịkwụsị ndị iro a n'ọnụ ụzọ ámá - na schema mmanye - na-emeso ha n'ìhè, kama ka emechaa mgbe ha na-amalite na-ezo n'ime ọchịchịrị omimi nke koodu mmepụta gị.

Ịmenye atụmatụ na-enye gị mmesi obi ike na atụmatụ tebụl gị agaghị agbanwe ma ọ bụrụ na ị kwadoro mgbanwe ahụ. Nke a na-egbochi dilution data, nke nwere ike ime mgbe a na-agbakwunye kọlụm ọhụrụ ugboro ugboro na nke bara uru na mbụ, tebụl abịakọrọ na-efunahụ ihe ha pụtara na uru n'ihi ntinye data. Site n'ịgba gị ume ka ị na-akpachapụ anya, tọọ ụkpụrụ dị elu, ma na-atụ anya ịdị mma dị elu, mmanye schema na-eme kpọmkwem ihe e mere ya ka ọ mee-enyere gị aka ịnọgide na-enwe akọnuche na akwụkwọ mgbasa ozi gị dị ọcha.

Ọ bụrụ na nlebakwuo anya, ị ga-ekpebi na ị bụ n'ezie mkpa tinye kọlụm ọhụrụ - enweghị nsogbu, n'okpuru bụ ndozi otu ahịrị. Ihe ngwọta bụ evolushọn nke sekit!

Gịnị bụ schema evolushọn?

Schema evolushọn bụ atụmatụ na-enye ndị ọrụ ohere ịgbanwe atụmatụ tebụl dị ugbu a dị ka data na-agbanwe ka oge na-aga. A na-ejikarị ya mgbe ị na-arụ ọrụ mgbakwunye ma ọ bụ degharịa iji megharịa atụmatụ ahụ ozugbo iji tinye otu kọlụm ọhụrụ ma ọ bụ karịa.

Kedu ka evolushọn schema si arụ ọrụ?

N'ịgbaso ihe atụ sitere na ngalaba gara aga, ndị mmepe nwere ike iji schema evolushọn ngwa ngwa tinye ogidi ọhụrụ ndị a jụrụ na mbụ n'ihi enweghị nkwekọrịta schema. A na-arụ ọrụ evolushọn sekit site na ịgbakwunye .option('mergeSchema', 'true') nye ndị otu Spark gị .write или .writeStream.

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

Ka ilele eserese ahụ, gbaa ajụjụ Spark SQL ndị a

# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%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: mmanye na mgbanwe atụmatụ
N'aka nke ọzọ, ịnwere ike ịtọ nhọrọ a maka nnọkọ Spark dum site na ịgbakwunye spark.databricks.delta.schema.autoMerge = True na nhazi Spark. Mana jiri nke a na-akpachara anya, n'ihi na mmanye schema agaghịzi eme ka ị mara maka atụmatụ aghụghọ na-amaghị ama.

Site na itinye oke na arịrịọ ahụ mergeSchema, A na-agbakwunye kọlụm niile dị na DataFrame mana ọ bụghị na tebụl ebumnuche na-akpaghị aka na njedebe nke atụmatụ ahụ dịka akụkụ nke azụmahịa ederede. Enwere ike ịgbakwunye ubi akwụghị ụgwọ ma a ga-agbakwunyekwa ndị a na njedebe nke kọlụm nhazi kwekọrọ.

Ndị injinia ụbọchị na ndị ọkà mmụta sayensị data nwere ike iji nhọrọ a tinye kọlụm ọhụrụ (ikekwe metric esoro nso nso a ma ọ bụ kọlụm arụmọrụ ahịa nke ọnwa a) na tebụl nrụpụta igwe ha dị ugbu a na-emebighị ụdị dị adị dabere na kọlụm ochie.

A na-anabata ụdị mgbanwe schema ndị a dị ka akụkụ nke schema evolushọn n'oge mgbakwunye tebụl ma ọ bụ degharịa:

  • Ịtinye kọlụm ọhụrụ (nke a bụ ọnọdụ a na-ahụkarị)
  • Ịgbanwe ụdị data sitere na NullType -> ụdị ọ bụla ọzọ ma ọ bụ ịkwalite site na ByteType -> ShortType -> IntegerType

Mgbanwe ndị ọzọ anabataghị n'ime evolushọn schema chọrọ ka e degharịa atụmatụ na data site na ịgbakwunye .option("overwriteSchema", "true"). Dịka ọmụmaatụ, n'ọnọdụ ebe kọlụm "Foo" bụ mbụ integer na atụmatụ ọhụrụ ahụ bụ ụdị data eriri, mgbe ahụ, ọ ga-adị mkpa ka edegharịa faịlụ Parquet (data) niile. Mgbanwe ndị dị otú ahụ gụnyere:

  • ihichapụ kọlụm
  • na-agbanwe ụdị data nke kọlụm dị (n'ebe)
  • na-atụgharị aha kọlụm ndị dị iche naanị n'ọnọdụ (dịka ọmụmaatụ, "Foo" na "foo")

N'ikpeazụ, na ntọhapụ nke Spark 3.0 na-esote, a ga-akwado DDL nke ọma (iji ALTER TABLE), na-enye ndị ọrụ ohere ịme omume ndị a na nhazi tebụl:

  • na-agbakwụnye ogidi
  • na-agbanwe nkọwa kọlụm
  • ịtọ ntọala tebụl na-achịkwa omume tebụl, dị ka ịtọ ogologo oge echekwara ndekọ azụmahịa.

Kedu uru evolushọn sekit bara?

Enwere ike iji evolushọn Schema mgbe ọ bụla ị bu n'obi gbanwee atụmatụ nke tebụl gị (na-emegide mgbe ị gbakwunyere kọlụm na mberede na DataFrame gị nke na-ekwesịghị ịdị ebe ahụ). Nke a bụ ụzọ kachasị mfe iji kwaga schema gị n'ihi na ọ na-agbakwunye aha kọlụm ziri ezi na ụdị data na-akpaghị aka na-enweghị ikwupụta ha nke ọma.

nkwubi

Ndị mmanye schema na-ajụ kọlụm ọhụrụ ọ bụla ma ọ bụ mgbanwe atụmatụ ndị ọzọ na-adabaghị na tebụl gị. Site na ịtọ na idobe ụkpụrụ ndị a dị elu, ndị nyocha na ndị injinia nwere ike ịtụkwasị obi na data ha nwere ọkwa kachasị elu nke iguzosi ike n'ezi ihe, na-ekwurịta ya nke ọma na n'ụzọ doro anya, na-enye ha ohere ịme mkpebi azụmahịa ka mma.

N'aka nke ọzọ, schema evolushọn na-akwado mmanye site n'ime ka ọ dị mfe ebubo akpaka schema mgbanwe. E kwuwerị, ọ gaghị esi ike ịgbakwunye kọlụm.

Ngwa mmanye nke atụmatụ ahụ bụ yang, ebe evolushọn nke atụmatụ ahụ bụ yin. Mgbe ejikọtara ọnụ, njirimara ndị a na-eme ka mkpọtụ mkpọtụ na ngbanwe akara dị mfe karịa mgbe ọ bụla.

Ọ ga-amasịkwa anyị ikele Mukul Murthy na Pranav Anand maka ntinye aka ha na edemede a.

Akụkọ ndị ọzọ na nsonso a:

Banye n'ime ọdọ mmiri Delta: Na-ebupụ ihe ndekọ azụmahịa

Akụkọ metụtara

Ọmụmụ igwe-ọkwa mmepụta na Delta Lake

Gịnị bụ ọdọ data?

Chọpụta ihe gbasara nkuzi a

isi: www.habr.com

Tinye a comment