හෙලෝ, හබ්ර්! ලිපියේ පරිවර්තනයක් මම ඔබේ අවධානයට ඉදිරිපත් කරමි පාඨමාලා දියත් කිරීමේ අපේක්ෂාවෙන් සකස් කරන ලද බුරාක් යවුස්, බ්රෙනර් හයින්ට්ස් සහ ඩෙනී ලී විසින් OTUS වෙතින්.

අපගේ අත්දැකීම් මෙන් දත්ත නිරන්තරයෙන් සමුච්චය වී පරිණාමය වේ. ඉදිරියට යාමට නම්, ලෝකයේ අපගේ මානසික ආකෘති නව දත්ත වලට අනුවර්තනය විය යුතු අතර, ඒවායින් සමහරක් නව මානයන් අඩංගු වේ - අපට කලින් කිසිම අදහසක් නොතිබූ දේවල් නිරීක්ෂණය කිරීමේ නව ක්රම. මෙම මානසික ආකෘති අප නව තොරතුරු වර්ගීකරණය කර සකසන ආකාරය තීරණය කරන පැතුරුම්පත් වල යෝජනා ක්රම මෙන් නොවේ.
මෙය අපව යෝජනා ක්රම කළමනාකරණය පිළිබඳ ගැටලුවට ගෙන එයි. ව්යාපාර ඉලක්ක සහ අවශ්යතා කාලයත් සමඟ පරිණාමය වන විට, ඔබේ දත්තවල ව්යුහය ද එසේමය. දත්ත වෙනස් වන විට නව මානයන් හඳුන්වා දීම ඩෙල්ටා ලේක් පහසු කරයි. පරිශීලකයින්ට ඔවුන්ගේ වගු යෝජනා ක්රම කළමනාකරණය කිරීම සඳහා සරල අර්ථකථන වෙත ප්රවේශය ඇත. මෙම මෙවලම් අතරට Schema Enforcement ඇතුළත් වන අතර එමඟින් පරිශීලකයින් නොදැනුවත්වම දෝෂ හෝ අනවශ්ය දත්ත සමඟ ඔවුන්ගේ වගු අවුල් කිරීමෙන් ආරක්ෂා කරයි, සහ සුදුසු ස්ථානවල වටිනා දත්ත අඩංගු නව තීරු ස්වයංක්රීයව එකතු කරන Schema Evolution ඇතුළත් වේ. මෙම ලිපියෙන්, අපි මෙම මෙවලම් භාවිතා කිරීම ගැඹුරට කිමිදෙමු.
වගු යෝජනා ක්රම තේරුම් ගැනීම
Apache Spark හි සෑම DataFrame එකකම දත්ත වර්ග, තීරු සහ පාර-දත්ත වැනි දත්තවල ස්වරූපය නිර්වචනය කරන යෝජනා ක්රමයක් අඩංගු වේ. Delta Lake සමඟ, වගු යෝජනා ක්රමය ගනුදෙනු ලොගය තුළ JSON ආකෘතියෙන් ගබඩා කර ඇත.
යෝජනා ක්රම බලාත්මක කිරීම යනු කුමක්ද?
Schema Enforcement, Schema Validation ලෙසද හැඳින්වේ, එය ඩෙල්ටා ලේක් හි ආරක්ෂක යාන්ත්රණයක් වන අතර එය වගුවේ යෝජනා ක්රමයට අනුකූල නොවන වාර්තා ප්රතික්ෂේප කිරීමෙන් දත්තවල ගුණාත්මකභාවය සහතික කරයි. වෙන් කිරීම් පමණක් පිළිගන්නා ජනප්රිය අවන්හලක සත්කාරක සේවිකාවක් මෙන්, Schema Enforcement වගුවට ඇතුළත් කර ඇති සෑම දත්ත තීරුවක්ම අපේක්ෂිත තීරුවල අනුරූප ලැයිස්තුවක තිබේද යන්න පරීක්ෂා කරයි (වෙනත් වචන වලින් කිවහොත්, එක් එක් සඳහා "වෙන් කිරීමක්" තිබේද යන්න) සහ ලැයිස්තුවේ නොමැති තීරු සහිත ඕනෑම වාර්තාවක් ප්රතික්ෂේප කරයි.
ක්රමලේඛන බලාත්මක කිරීම ක්රියාත්මක වන්නේ කෙසේද?
ඩෙල්ටා ලේක් ලිවීමේ ක්රමලේඛන පරීක්ෂාව භාවිතා කරයි, එනම් වගුවකට අලුතින් ලියන සියලුම ලිපි ලිවීමේ වේලාවේදී ඉලක්ක වගුවේ යෝජනා ක්රමය සමඟ අනුකූලතාවය සඳහා පරීක්ෂා කරනු ලැබේ. යෝජනා ක්රමය නොගැලපේ නම්, ඩෙල්ටා ලේක් ගනුදෙනුව සම්පූර්ණයෙන්ම නවතා දමයි (දත්ත ලියා නැත) සහ නොගැලපීම පිළිබඳව පරිශීලකයාට දැනුම් දීම සඳහා ව්යතිරේකයක් මතු කරයි.
වාර්තාවක් වගුවක් සමඟ අනුකූලද යන්න තීරණය කිරීම සඳහා ඩෙල්ටා ලේක් පහත නීති භාවිතා කරයි. දත්ත රාමුව ලියා ඇත:
- ඉලක්ක වගුවේ යෝජනා ක්රමයේ නොමැති අමතර තීරු එයට අඩංගු විය නොහැක. අනෙක් අතට, එන දත්තවල වගුවේ සෑම තීරුවක්ම අඩංගු නොවන්නේ නම් එය හොඳයි - එම තීරුවලට ශුන්ය අගයන් පවරනු ලැබේ.
- ඉලක්ක වගුවේ ඇති තීරු දත්ත වර්ගවලට වඩා වෙනස් තීරු දත්ත වර්ග තිබිය නොහැක. ඉලක්ක වගුවේ ඇති තීරුවක StringType දත්ත අඩංගු වන අතර, DataFrame හි අනුරූප තීරුවේ IntegerType දත්ත අඩංගු නම්, යෝජනා ක්රම ක්රියාත්මක කිරීම ව්යතිරේකයක් ඇති කර ලිවීමේ ක්රියාවලිය සිදුවීම වළක්වයි.
- නඩුවේදී පමණක් වෙනස් වන තීරු නම් අඩංගු විය නොහැක. මෙයින් අදහස් කරන්නේ ඔබට 'Foo' සහ 'foo' ලෙස නම් කර ඇති තීරු එකම වගුවේ අර්ථ දැක්විය නොහැකි බවයි. Spark නඩුව-සංවේදී හෝ නඩුව-සංවේදී නොවන ආකාරයෙන් භාවිතා කළ හැකි වුවද (පෙරනිමියෙන්), ඩෙල්ටා ලේක් නඩුව ආරක්ෂා කරයි, නමුත් යෝජනා ක්රම ගබඩා කිරීමේදී නඩුව-සංවේදී නොවේ. තීරු තොරතුරු ගබඩා කිරීමේදී සහ ලබා ගැනීමේදී Parquet නඩුව-සංවේදී වේ. විභව දෝෂ, දත්ත දූෂණය හෝ දත්ත නැතිවීම (Databricks හි අපි පෞද්ගලිකව අත්විඳ ඇති) වළක්වා ගැනීම සඳහා, අපි මෙම සීමාව එක් කිරීමට තීරණය කළෙමු.
මෙය නිදර්ශනය කිරීම සඳහා, ඩෙල්ටා ලේක් වගුවකට අලුතින් ජනනය කරන ලද තීරු කිහිපයක් එකතු කිරීමට උත්සාහ කරන විට, ඒවා පිළිගැනීමට තවමත් වින්යාස කර නොමැති විට පහත කේතයේ සිදුවන්නේ කුමක්දැයි බලමු.
# Сгенерируем 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.ස්වයංක්රීයව නව තීරු එකතු කිරීම වෙනුවට, ඩෙල්ටා ලේක් යෝජනා ක්රමයක් ක්රියාත්මක කර ලිවීම නවත්වයි. විෂමතාවයට හේතු වන තීරුව (හෝ තීරු කට්ටල) තීරණය කිරීමට උපකාර කිරීම සඳහා, සංසන්දනය සඳහා ස්පාර්ක් විසින් ස්ටැක් හෝඩුවාවෙන් යෝජනා ක්රම දෙකම පෙන්වයි.
යෝජනා ක්රමය ක්රියාත්මක කිරීමෙන් ලැබෙන ප්රතිලාභය කුමක්ද?
යෝජනා ක්රම ක්රියාත්මක කිරීම තරමක් දැඩි පරීක්ෂාවක් වන බැවින්, එය නිෂ්පාදනය හෝ පරිභෝජනය සඳහා සූදානම් පිරිසිදු, සම්පූර්ණයෙන්ම පරිවර්තනය කරන ලද දත්ත කට්ටලයකට දොරටු පාලකයෙකු ලෙස භාවිතා කිරීම සඳහා විශිෂ්ට මෙවලමකි. එය සාමාන්යයෙන් දත්ත සෘජුවම පෝෂණය කරන වගු සඳහා යොදනු ලැබේ:
- යන්ත්ර ඉගෙනුම් ඇල්ගොරිතම
- BI උපකරණ පුවරු
- දත්ත විශ්ලේෂණ සහ දෘශ්යකරණ මෙවලම්
- දැඩි ලෙස ව්යුහගත, දැඩි ලෙස ටයිප් කරන ලද අර්ථකථන යෝජනා ක්රම අවශ්ය කරන ඕනෑම නිෂ්පාදන පද්ධතියක්.
මෙම අවසාන බාධකය සඳහා ඔවුන්ගේ දත්ත සකස් කිරීම සඳහා, බොහෝ පරිශීලකයින් සරල "බහු-හොප්" ගෘහ නිර්මාණ ශිල්පයක් භාවිතා කරන අතර එමඟින් ක්රමයෙන් ඔවුන්ගේ වගු වලට ව්යුහය හඳුන්වා දෙයි. වැඩි විස්තර සඳහා, ඔබට ලිපිය කියවිය හැකිය.
ඇත්ත වශයෙන්ම, ඔබට ඔබේ නල මාර්ගයේ ඕනෑම තැනක යෝජනා ක්රම ක්රියාත්මක කිරීම භාවිතා කළ හැකිය, නමුත් මෙම අවස්ථාවේදී වගුවකට ලිවීම කලකිරීමට කරුණක් විය හැකි බව මතක තබා ගන්න, උදාහරණයක් ලෙස, ඔබ එන දත්ත වලට තවත් තීරුවක් එක් කළ බව ඔබට අමතක වූ නිසා.
දත්ත ද්රවීකරණය වැළැක්වීම
මේ අවස්ථාවේදී, ඔබ කල්පනා කරනවා ඇති මේ කලබලේ මොකක්ද කියලා? සියල්ලට පසු, සමහර විට අනපේක්ෂිත "schema mismatch" දෝෂයක් ඔබේ වැඩ ප්රවාහයේදී ඔබව අවුල් කළ හැකිය, විශේෂයෙන් ඔබ ඩෙල්ටා ලේක් වෙත අලුත් නම්. කුමක් වුවත් මට මගේ DataFrame ලිවීමට හැකි වන පරිදි අවශ්ය පරිදි යෝජනා ක්රමය වෙනස් කිරීමට ඉඩ නොදෙන්නේ ඇයි?
පැරණි කියමනක් පවසන පරිදි, "වැළැක්වීමේ අවුන්සයක් සුව කිරීමට රාත්තලක් වටිනවා." යම් අවස්ථාවක දී, ඔබ ඔබේ යෝජනා ක්රමය ක්රියාත්මක කිරීමට සැලකිලිමත් නොවන්නේ නම්, දත්ත වර්ග අනුකූලතා ගැටළු ඔවුන්ගේ කැත හිස ඔසවනු ඇත - පෙනෙන පරිදි සමජාතීය අමු දත්ත මූලාශ්රවල දාර නඩු, දූෂිත තීරු, විකෘති සිතියම්කරණයන් හෝ වෙනත් බියකරු සිහින අඩංගු විය හැකිය. හොඳම ප්රවේශය වන්නේ මෙම සතුරන් ගේට්ටුවේදී නැවැත්වීමයි - යෝජනා ක්රම ක්රියාත්මක කිරීම සමඟ - සහ ඔවුන් ඔබේ නිෂ්පාදන කේතයේ අඳුරු ගැඹුරේ සැඟවී සිටීමට පටන් ගන්නා විට, පසුව නොව විවෘතව ඔවුන් සමඟ කටයුතු කිරීමයි.
ඔබ පැහැදිලිවම වෙනස අනුමත කරන තුරු ඔබේ වගුවේ යෝජනා ක්රමය වෙනස් නොවන බව යෝජනා ක්රම බලාත්මක කිරීම සහතික කරයි. මෙය දත්ත තනුක කිරීම වළක්වයි, නව තීරු නිතර එකතු කරන විට සිදුවිය හැකි අතර, කලින් වටිනා, සංයුක්ත වගු දත්ත ගලා ඒම නිසා ඒවායේ අර්ථය සහ ප්රයෝජනවත් බව නැති කර ගනී. ඔබව අභිප්රායෙන් කටයුතු කිරීමට, ඉහළ ප්රමිතීන් සැකසීමට සහ උසස් තත්ත්වය අපේක්ෂා කිරීමට දිරිමත් කිරීමෙන්, යෝජනා ක්රම බලාත්මක කිරීම එය කිරීමට අදහස් කළ දේ හරියටම කරයි - ඔබට අඛණ්ඩතාව පවත්වා ගැනීමට සහ ඔබේ වගු පිරිසිදුව තබා ගැනීමට උපකාරී වේ.
තවදුරටත් සලකා බැලීමෙන් පසු ඔබ ඇත්තටම එසේ කරන බව තීරණය කළහොත් අවශ්යයි නව තීරුවක් එකතු කිරීම ගැටළුවක් නොවේ; එක් පේළි විසඳුමක් පහතින් සපයා ඇත. විසඳුම යෝජනා ක්රම පරිණාමයයි!
යෝජනා ක්රම පරිණාමය යනු කුමක්ද?
Schema evolution යනු කාලයත් සමඟ වෙනස් වන දත්ත වලට ඉඩ සැලසෙන පරිදි වගුවක වත්මන් schema පහසුවෙන් වෙනස් කිරීමට පරිශීලකයින්ට ඉඩ සලසන විශේෂාංගයකි. එය බොහෝ විට භාවිතා කරනුයේ නව තීරු එකක් හෝ කිහිපයක් ඇතුළත් කිරීමට schema ස්වයංක්රීයව අනුවර්තනය කිරීම සඳහා ඇතුළු කිරීමේ හෝ නැවත ලිවීමේ මෙහෙයුම් වලදීය.
ස්කීමා පරිණාමය ක්රියාත්මක වන්නේ කෙසේද?
පෙර කොටසේ උදාහරණය අනුගමනය කරමින්, සංවර්ධකයින්ට යෝජනා ක්රම අනුකූල නොවීම හේතුවෙන් කලින් ප්රතික්ෂේප කරන ලද නව තීරු එකතු කිරීමට යෝජනා ක්රම පරිණාමය පහසුවෙන් භාවිතා කළ හැකිය. යෝජනා ක්රම පරිණාමය සක්රිය කරනු ලබන්නේ .option('mergeSchema', 'true') ඔබේ Spark කණ්ඩායමට .write или .writeStream.
# Добавьте параметр mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)ප්රස්ථාරය බැලීමට, පහත 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 
විකල්පයක් ලෙස, ඔබට එකතු කිරීමෙන් මුළු Spark සැසිය සඳහාම මෙම විකල්පය සැකසිය හැක spark.databricks.delta.schema.autoMerge = True Spark වින්යාසය තුළට. කෙසේ වෙතත්, මෙය ප්රවේශමෙන් භාවිතා කරන්න, මන්ද schema ක්රියාත්මක කිරීම තවදුරටත් ඔබට නොදැනුවත්වම schema නොගැලපීම් පිළිබඳව අනතුරු අඟවන්නේ නැත.
ඉල්ලීමෙහි පරාමිතියක් ඇතුළත් කිරීමෙන් mergeSchemaDataFrame හි ඇති නමුත් ඉලක්ක වගුවෙන් අතුරුදහන් වූ සියලුම තීරු ලිවීමේ ගනුදෙනුව අතරතුර ස්වයංක්රීයව යෝජනා ක්රමයට එකතු වේ. කැදැලි ක්ෂේත්ර ද එකතු කළ හැකි අතර, ඒවා ව්යුහයේ අනුරූප තීරුවලට ද එකතු කෙරේ.
දත්ත ඉංජිනේරුවන්ට සහ විද්යාඥයින්ට පැරණි තීරු මත පදනම්ව පවතින ආකෘති බිඳ දැමීමකින් තොරව ඔවුන්ගේ පවතින යන්ත්ර ඉගෙනුම් නිෂ්පාදන වගු වලට නව තීරු (සමහර විට මෑතකදී නිරීක්ෂණය කරන ලද මිතිකයක් හෝ මෙම මාසය සඳහා විකුණුම් සංඛ්යා තීරුවක්) එකතු කිරීමට මෙම විකල්පය භාවිතා කළ හැකිය.
වගු ඇතුළු කිරීමේදී හෝ නැවත ලිවීමේදී යෝජනා ක්රම පරිණාමයේ කොටසක් ලෙස පහත ආකාරයේ යෝජනා ක්රම වෙනස්කම් වලට අවසර දෙනු ලැබේ:
- නව තීරු එකතු කිරීම (මෙය වඩාත් පොදු අවස්ථාවයි)
- NullType -> වෙනත් ඕනෑම වර්ගයකින් දත්ත වර්ග වෙනස් කිරීම හෝ ByteType -> ShortType -> IntegerType වෙතින් ප්රවර්ධනය කිරීම
යෝජනා ක්රම පරිණාමය තුළ ඉඩ නොදෙන අනෙකුත් වෙනස්කම් සඳහා යෝජනා ක්රමය සහ දත්ත එකතු කිරීමෙන් නැවත ලිවීමට අවශ්ය වේ. .option("overwriteSchema", "true")උදාහරණයක් ලෙස, "Foo" තීරුව මුලින් පූර්ණ සංඛ්යාවක් නම් සහ නව යෝජනා ක්රමය තන්තු දත්ත වර්ගයක් නම්, සියලුම Parquet (දත්ත) ගොනු නැවත ලිවිය යුතුය. එවැනි වෙනස්කම් වලට ඇතුළත් වන්නේ:
- තීරුවක් මකා දැමීම
- පවතින තීරුවක දත්ත වර්ගය වෙනස් කිරීම (ස්ථානයේ)
- අවස්ථා වලදී පමණක් වෙනස් වන තීරු නැවත නම් කිරීම (උදා: "Foo" සහ "foo")
අවසාන වශයෙන්, ඊළඟ නිකුතුව වන Spark 3.0 සමඟ, පැහැදිලි DDL (ALTER TABLE භාවිතා කරමින්) සම්පූර්ණයෙන්ම සහය දක්වනු ඇත, පරිශීලකයින්ට වගු යෝජනා ක්රම මත පහත ක්රියා සිදු කිරීමට ඉඩ සලසයි:
- තීරු එකතු කිරීම
- තීරු අදහස් වෙනස් කිරීම
- ගනුදෙනු ලොග් රඳවා ගැනීමේ කාලය සැකසීම වැනි වගුවේ හැසිරීම තීරණය කරන වගු ගුණාංග සැකසීම.
යෝජනා ක්රම පරිණාමයේ ප්රතිලාභය කුමක්ද?
Schema evolution ඔබ ඕනෑම අවස්ථාවක භාවිතා කළ හැක අදහස් කිරීමට ඔබගේ වගුවේ යෝජනා ක්රමය වෙනස් කරන්න (ඔබේ දත්ත රාමුවට අහම්බෙන් එකතු කළ යුතු තීරු එකතු කිරීමට ප්රතිවිරුද්ධව). මෙය ඔබගේ යෝජනා ක්රමය සංක්රමණය කිරීමට ඇති පහසුම ක්රමයයි, මන්ද එය නිශ්චිතව ප්රකාශ කිරීමකින් තොරව නිවැරදි තීරු නම් සහ දත්ත වර්ග ස්වයංක්රීයව එකතු කරයි.
නිගමනය
යෝජනා ක්රම බලාත්මක කිරීම ඔබගේ වගුවට නොගැලපෙන ඕනෑම නව තීරු හෝ වෙනත් යෝජනා ක්රම වෙනස්කම් ප්රතික්ෂේප කරයි. මෙම ඉහළ ප්රමිතීන් සැකසීම සහ පවත්වා ගැනීමෙන්, විශ්ලේෂකයින්ට සහ ඉංජිනේරුවන්ට ඔවුන්ගේ දත්තවල ඉහළම මට්ටමේ අඛණ්ඩතාවයක් ඇති බවට විශ්වාස කළ හැකි අතර, ඒ පිළිබඳව පැහැදිලිව සහ සංක්ෂිප්තව තර්ක කර, වඩාත් ඵලදායී ව්යාපාරික තීරණ ගැනීමට ඔවුන්ට හැකි වේ.
අනෙක් අතට, යෝජනා ක්රමයේ පරිණාමය සරල කිරීම මගින් බලාත්මක කිරීම සම්පූර්ණ කරයි චෝදනා කරන ලද ස්වයංක්රීය ක්රමලේඛන වෙනස්වීම්. සියල්ලට පසු, තීරුවක් එකතු කිරීම එතරම් අපහසු නොවිය යුතුය.
පරිපථ බලාත්මක කිරීම යනු පරිපථ පරිණාමයේ යින් සඳහා යැං ය. එකට භාවිතා කිරීමෙන්, මෙම විශේෂාංග ශබ්ද මර්දනය සහ සංඥා සුසර කිරීම කිසිදා නොවූ තරම් පහසු කරයි.
මෙම ලිපියට දායක වූ මුකුල් මූර්ති සහ ප්රණව් ආනන්ද් යන අයටද අපි ස්තූතිවන්ත වෙමු.
මෙම ලිපි මාලාවේ අනෙකුත් ලිපි:

අදාළ ලිපි
මූලාශ්රය: www.habr.com
