Aloha, Habr! Ke hāʻawi aku nei au iā ʻoe i kahi unuhi o ka ʻatikala nā mea kākau ʻo Burak Yavuz, Brenner Heintz lāua ʻo Denny Lee, i hoʻomākaukau ʻia i mua o ka hoʻomaka ʻana o ka papa. mai OTUS.

ʻO ka ʻikepili, e like me kā mākou ʻike, ke hōʻiliʻili mau nei a me ka ulu ʻana. No ka hoʻomau ʻana, pono e hoʻololi i kā mākou mau hiʻohiʻona noʻonoʻo o ka honua i ka ʻikepili hou, aia kekahi o ia mau ʻano hou - nā ala hou e nānā ai i nā mea a mākou i ʻike ʻole ai ma mua. ʻAʻole ʻokoʻa loa kēia mau hiʻohiʻona noʻonoʻo mai ka papaʻaina papa e hoʻoholo ai i ka hoʻokaʻawale ʻana a me ka hana ʻana i ka ʻike hou.
Lawe kēia iā mākou i ka pilikia o ka hoʻokele schema. Ke hoʻololi nei nā pilikia a me nā koi ʻoihana i ka manawa, pēlā ke ʻano o kāu ʻikepili. Maʻalahi ka Delta Lake e hoʻokomo i nā ana hou i ka loli ʻana o ka ʻikepili. Loaʻa i nā mea hoʻohana i nā semantics maʻalahi e hoʻokele i kā lākou papa papaʻaina. Aia kēia mau mea hana i ka Schema Enforcement, ka mea e pale ai i nā mea hoʻohana mai ka hoʻohaumia ʻole ʻana i kā lākou mau papa me nā hewa a i ʻole ka ʻikepili pono ʻole, a me ka Schema Evolution, e ʻae ai i nā kolamu hou o nā ʻikepili waiwai e hoʻohui ʻia i nā wahi kūpono. Ma kēia ʻatikala, e luʻu hohonu mākou i ka hoʻohana ʻana i kēia mau mea hana.
Ka Hoomaopopo ana i na Papahana Papa
Loaʻa i kēlā me kēia DataFrame ma Apache Spark kahi schema e wehewehe i ke ʻano o ka ʻikepili, e like me nā ʻano ʻikepili, kolamu, a me nā metadata. Me Delta Lake, mālama ʻia ka papaʻaina ma ka JSON format i loko o ka log transaction.
He aha ka hoʻokō papahana?
ʻO ka Schema Enforcement, i ʻike ʻia ʻo Schema Validation, he ʻano palekana ma Delta Lake e hōʻoiaʻiʻo ana i ka maikaʻi o ka ʻikepili ma o ka hōʻole ʻana i nā moʻolelo i kūlike ʻole i ka schema o ka papaʻaina. E like me ka mea hoʻokipa ma ke keʻena mua o kahi hale ʻaina kaulana-wale nō, nānā ʻo ia inā aia kēlā me kēia kolamu o ka ʻikepili i hoʻokomo ʻia i loko o ka papaʻaina i ka papa inoa kūpono o nā kolamu i manaʻo ʻia (ma nā huaʻōlelo ʻē aʻe, inā he "reserve" no kēlā me kēia. ), a hōʻole i nā moʻolelo me nā kolamu ʻaʻole i ka papa inoa.
Pehea ka hoʻokō ʻana o ka schema?
Hoʻohana ʻo Delta Lake i ka schema-on-write checking, ʻo ia hoʻi, nānā ʻia nā mea kākau hou a pau i ka papaʻaina no ka hoʻohālikelike ʻana me ka schema o ka papa kuhikuhi i ka manawa kākau. Inā kū ʻole ka schema, hoʻopau ʻo Delta Lake i ke kālepa holoʻokoʻa (ʻaʻohe ʻikepili i kākau ʻia) a hoʻāla i kahi ʻokoʻa e hoʻomaopopo i ka mea hoʻohana i ka like ʻole.
Hoʻohana ʻo Delta Lake i kēia mau lula no ka hoʻoholo ʻana inā kūpono kahi moʻolelo me kahi papa. ʻIkepili ʻikepili hiki ke kākau:
- ʻAʻole hiki ke loaʻa i nā kolamu ʻē aʻe ʻaʻole i loko o ka papa kuhikuhi o ka papa kuhikuhi. ʻO ka mea ʻē aʻe, maikaʻi nā mea āpau inā ʻaʻole i loaʻa i ka ʻikepili e komo mai nā kolamu a pau mai ka papa - e hāʻawi wale ʻia kēia mau kolamu i nā waiwai null.
- ʻAʻole hiki ke loaʻa nā ʻano ʻikepili kolamu i ʻokoʻa mai nā ʻano ʻikepili o nā kolamu i ka papa kuhikuhi. Inā loaʻa i ka kolamu papa kuhikuhi ka ʻikepili StringType, akā aia ka kolamu pili i ka DataFrame i ka ʻikepili IntegerType, e hoʻolei ka hoʻokō ʻana i kahi ʻokoʻa a pale i ka hana kākau.
- ʻAʻole hiki ke loaʻa nā inoa kolamu i ʻokoʻa wale i ka hihia. 'O ia ho'i, 'a'ole hiki ke loa'a nā kolamu i kapa 'ia 'Foo' a me 'foo' i wehewehe 'ia ma ka papa like. ʻOiai hiki ke hoʻohana ʻia ʻo Spark i ke ʻano hihia-sensitive a i ʻole case-insensitive (paʻamau), ʻo Delta Lake ka mālama ʻana i ka hihia akā ʻaʻole i ʻike ʻia i loko o ka waihona schema. Hoʻopili ʻia ka parquet i ka wā e mālama a hoʻihoʻi i ka ʻike kolamu. No ka pale ʻana i nā hewa hiki, palaho ʻikepili, a i ʻole nalowale ʻikepili (kekahi mea a mākou i ʻike pilikino ma Databricks), ua hoʻoholo mākou e hoʻohui i kēia palena.
No ka hōʻike ʻana i kēia, e nānā kāua i ka mea e hana nei i ke code ma lalo ke hoʻāʻo mākou e hoʻohui i kekahi mau kolamu hou i hana ʻia i ka papa ʻaina Delta Lake ʻaʻole i hoʻonohonoho ʻia e ʻae iā lākou.
# Сгенерируем 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.Ma kahi o ka hoʻohui ʻana i nā kolamu hou, ua kau ʻo Delta Lake i kahi schema a hoʻōki i ke kākau ʻana. No ke kōkua ʻana i ka hoʻoholo ʻana i ke kolamu (a i ʻole ka hoʻonohonoho ʻana o nā kolamu) ke kumu i ka ʻokoʻa, hoʻopuka ʻo Spark i nā schema ʻelua mai ka papa kuhikuhi no ka hoʻohālikelike.
He aha ka pōmaikaʻi o ka hoʻokō ʻana i kahi schema?
No ka mea, ʻo ka hoʻokō ʻana i ka schema kahi mākaʻikaʻi paʻa loa, he mea hana maikaʻi loa ia e hoʻohana ai ma ke ʻano he kiaʻi puka i kahi pūʻulu ʻikepili maʻemaʻe, hoʻololi piha ʻia i mākaukau no ka hana ʻana a ʻai paha. Hoʻohana maʻamau i nā papa e hānai pono i ka ʻikepili:
- Nā algorithms aʻo mīkini
- Nā papa kuhikuhi BI
- ʻIkepili ʻikepili a me nā mea hana ʻike
- ʻO kēlā me kēia ʻōnaehana hana e koi ana i nā ʻōkuhi semantic i kūkulu ʻia me ka ikaika.
No ka hoʻomākaukau ʻana i kā lākou ʻikepili no kēia pilikia hope, nui nā mea hoʻohana e hoʻohana i kahi hoʻolālā "multi-hop" maʻalahi e hoʻokomo mālie i ka hale i kā lākou papa. No ka ʻike hou aku e pili ana i kēia, hiki iā ʻoe ke nānā i ka ʻatikala
ʻOiaʻiʻo, hiki ke hoʻohana ʻia ka hoʻokō schema ma nā wahi āpau o kāu pipeline, akā e hoʻomanaʻo i ka hoʻoheheʻe ʻana i ka papaʻaina i kēia hihia no ka mea, no ka laʻana, poina ʻoe ua hoʻohui ʻoe i kahi kolamu i ka ʻikepili e hiki mai ana.
Kāohi ʻana i ka dilution ʻikepili
I kēia manawa e noʻonoʻo paha ʻoe, he aha ka mea e hoʻopiʻi nei? Ma hope o nā mea a pau, i kekahi manawa hiki ʻole i kahi hewa "schema mismatch" hiki ke hoʻokau iā ʻoe i kāu kaʻina hana, ʻoiai inā he mea hou ʻoe i Delta Lake. No ke aha e ʻae ʻole ai i ka hoʻololi ʻana i ka schema e like me ka mea e pono ai i hiki iaʻu ke kākau i kaʻu DataFrame me ka mea ʻole?
E like me ka ʻōlelo kahiko, "hoʻokahi auneke o ka pale ʻana i ka paona o ka mālama ʻana." I kekahi manawa, inā ʻaʻole ʻoe e mālama pono i ka hoʻokō ʻana i kāu schema, e hoʻihoʻi nā pilikia hoʻohālikelike ʻano ʻikepili i ko lākou mau poʻo ʻino - ʻike ʻia nā kumu ʻikepili maka like ʻole i loaʻa i nā hihia lihi, nā kolamu ʻino, nā palapala palapala ʻino, a i ʻole nā mea weliweli ʻē aʻe e moeʻuhane ai. nā moeʻuhane. ʻO ke ala maikaʻi loa ʻo ka hoʻōki ʻana i kēia mau ʻenemi ma ka ʻīpuka - me ka hoʻokō schema - a hana me lākou i ka mālamalama, ma mua o ka wā e hoʻomaka ai lākou e hūnā i ka hohonu hohonu o kāu code hana.
Hāʻawi ka hoʻokō ʻana i kahi hoʻolālā iā ʻoe i ka ʻoiaʻiʻo ʻaʻole e loli ka loina o kāu papaʻaina ke ʻole ʻoe e ʻae i ka hoʻololi. ʻAʻole kēia i ka hoʻoheheʻe ʻana i ka ʻikepili, hiki ke hana ʻia ke hoʻohui pinepine ʻia nā kolamu hou a nalowale ka manaʻo a me ka pono o nā papa i hoʻopaʻa ʻia ma mua ma muli o ke kahe ʻana o ka ʻikepili. Ma ka paipai ʻana iā ʻoe e noʻonoʻo, hoʻonoho i nā kūlana kiʻekiʻe, a manaʻo i ke ʻano kiʻekiʻe, hana pololei ka hoʻokō ʻana i ka mea i hana ʻia e hana ai—kōkua iā ʻoe e hoʻomau i ka noʻonoʻo a me ka maʻemaʻe o kāu pāpalapala.
Inā ma ka noʻonoʻo hou ʻana e hoʻoholo ʻoe ʻoiaʻiʻo makemake hoʻohui i kahi kolamu hou - ʻaʻohe pilikia, aia ma lalo kahi hoʻoponopono laina hoʻokahi. ʻO ka hoʻonā ka hoʻomohala ʻana o ke kaapuni!
He aha ka schema evolution?
ʻO ka Schema evolution kahi hiʻohiʻona e hiki ai i nā mea hoʻohana ke hoʻololi maʻalahi i ka schema papaʻaina o kēia manawa e like me ka ʻikepili e loli ana i ka manawa. Hoʻohana pinepine ʻia ia i ka wā e hana ai i kahi hana hoʻopili a kākau hou paha e hoʻololi ʻakomi i ka schema e hoʻokomo i hoʻokahi a ʻoi aku paha nā kolamu hou.
Pehea ka holo ʻana o ka schema evolution?
Ma muli o ka laʻana mai ka ʻāpana mua, hiki i nā mea hoʻomohala ke hoʻohana maʻalahi i ka hoʻomohala ʻana i ka schema e hoʻohui i nā kolamu hou i hōʻole ʻia ma mua ma muli o ke kūlike ʻole o ka schema. Hoʻohana ʻia ka hoʻololi kaapuni ma ka hoʻohui ʻana .option('mergeSchema', 'true') i kāu hui Spark .write или .writeStream.
# Добавьте параметр mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)No ka nānā ʻana i ka pakuhi, e holo i kēia nīnau 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 
ʻO kahi ʻē aʻe, hiki iā ʻoe ke hoʻonohonoho i kēia koho no ka hui Spark holoʻokoʻa ma ka hoʻohui ʻana spark.databricks.delta.schema.autoMerge = True i ka hoʻonohonoho Spark. Akā, e hoʻohana i kēia me ka makaʻala, no ka mea, ʻaʻole e makaʻala hou ka hoʻokō schema iā ʻoe i nā kuhi hewa ʻole.
Ma ka hoʻokomo ʻana i ka ʻāpana i ka noi mergeSchema, ʻo nā kolamu āpau i loaʻa i ka DataFrame akā ʻaʻole i loko o ka papa kuhikuhi i hoʻohui ʻia i ka hopena o ka schema ma ke ʻano o kahi kālepa kākau. Hiki ke hoʻohui pū ʻia nā kahua i hoʻopaʻa ʻia a hoʻohui ʻia kēia mau mea i ka hopena o nā kolamu hoʻolālā e pili ana.
Hiki i nā ʻenekinia lā a me nā ʻepekema ʻikepili ke hoʻohana i kēia koho no ka hoʻohui ʻana i nā kolamu hou (malia paha he metric i nānā ʻia a i ʻole ke kolamu hana kūʻai o kēia mahina) i kā lākou papa hana hoʻonaʻauao mīkini e kū nei me ka haki ʻole i nā kumu hoʻohālike e pili ana i nā kolamu kahiko.
ʻAe ʻia nā ʻano hoʻololi hoʻololi ma ke ʻano he ʻāpana o ka hoʻomohala ʻana i ka papaʻaina i ka wā o ka hoʻohui ʻana a i ʻole ke kākau hou ʻana:
- Hoʻohui i nā kolamu hou (ʻo kēia ka hiʻohiʻona maʻamau)
- Ke hoʻololi nei i nā ʻano ʻikepili mai NullType -> kekahi ʻano ʻē aʻe a hoʻolaha paha mai ByteType -> ShortType -> IntegerType
ʻAʻole ʻae ʻia nā hoʻololi ʻē aʻe i loko o ka hoʻomohala ʻana i ka schema e pono e kākau hou ʻia ka schema a me ka ʻikepili ma ka hoʻohui ʻana .option("overwriteSchema", "true"). No ka laʻana, inā he helu helu mua ke kolamu "Foo" a ʻo ka schema hou he ʻano ʻikepili string, a laila pono e kākau hou ʻia nā faila Parquet(data). ʻO ia mau hoʻololi e like me:
- ka holoi ʻana i kahi kolamu
- hoʻololi i ke ʻano ʻikepili o kahi kolamu e kū nei (ma kahi)
- ka inoa hou ʻana i nā kolamu ʻokoʻa wale nō (e laʻa, "Foo" a me "foo")
ʻO ka hope, me ka hoʻokuʻu hou ʻana o Spark 3.0, e kākoʻo piha ʻia ʻo DDL (me ka hoʻohana ʻana iā ALTER TABLE), e ʻae i nā mea hoʻohana e hana i kēia mau hana ma nā papa kuhikuhi:
- hoʻohui i nā kolamu
- hoʻololi i nā manaʻo kolamu
- ka hoʻonohonoho ʻana i nā waiwai papa e hoʻomalu i ke ʻano o ka papaʻaina, e like me ka hoʻonohonoho ʻana i ka lōʻihi o ka manawa e mālama ʻia ai kahi moʻolelo kālepa.
He aha ka pōmaikaʻi o ka holomua kaapuni?
Hiki ke hoʻohana ʻia ka hoʻomohala ʻana o ka Schema i kēlā me kēia manawa manao e hoʻololi i ka schema o kāu papaʻaina (e kūʻē i ka wā āu i hoʻohui ai i nā kolamu i kāu DataFrame ʻaʻole pono ma laila). ʻO kēia ke ala maʻalahi e neʻe ai i kāu schema no ka mea e hoʻohui ʻokoʻa i nā inoa kolamu kūpono a me nā ʻano ʻikepili me ka ʻole e haʻi pololei iā lākou.
hopena
Hōʻole ka hoʻokō ʻana i nā kolamu hou a i ʻole nā hoʻololi hoʻolālā ʻē aʻe i kūpono ʻole me kāu pākaukau. Ma ka hoʻonohonoho ʻana a me ka mālama ʻana i kēia mau kūlana kiʻekiʻe, hiki i nā mea loiloi a me nā ʻenekini ke hilinaʻi i kā lākou ʻikepili i ke kiʻekiʻe kiʻekiʻe o ka pono, e kamaʻilio me ka maopopo a me ka maopopo, e ʻae iā lākou e hana i nā hoʻoholo ʻoihana ʻoi aku ka maikaʻi.
Ma ka ʻaoʻao ʻē aʻe, hoʻokō ʻo schema evolution i ka hoʻokō ʻana ma ka maʻalahi ʻōlelo ʻia hoʻololi ʻokoʻa hoʻolālā. Ma hope o nā mea a pau, ʻaʻole paʻakikī ke hoʻohui i kahi kolamu.
ʻO ka hoʻohana ikaika ʻana o ka hoʻolālā he yang, kahi o ka hoʻomohala ʻana o ka papahana ʻo yin. Ke hoʻohana pū ʻia, ʻoi aku ka maʻalahi o kēia mau hiʻohiʻona ma mua o ka wā.
Mahalo pū mākou iā Mukul Murthy lāua ʻo Pranav Anand no kā lākou hāʻawi ʻana i kēia ʻatikala.
Nā ʻatikala ʻē aʻe ma kēia moʻo:

Nā ʻatikala pili
Source: www.habr.com
