ඩෙල්ටා විලට කිමිදෙන්න: යෝජනා ක්‍රමය බලාත්මක කිරීම සහ පරිණාමය

හෙලෝ, හබ්ර්! ලිපියේ පරිවර්තනයක් මම ඔබේ අවධානයට ඉදිරිපත් කරමි "ඩෙල්ටා විලට කිමිදීම: යෝජනා ක්‍රමය බලාත්මක කිරීම සහ පරිණාමය" කතුවරුන් වන Burak Yavuz, Brenner Heintz සහ Denny Lee, පාඨමාලාවේ ආරම්භය අපේක්ෂාවෙන් සකස් කරන ලදී දත්ත ඉංජිනේරු OTUS වෙතින්.

ඩෙල්ටා විලට කිමිදෙන්න: යෝජනා ක්‍රමය බලාත්මක කිරීම සහ පරිණාමය

අපගේ අත්දැකීම් මෙන්ම දත්ත ද නිරන්තරයෙන් එකතු වෙමින් විකාශනය වේ. දිගටම පවත්වා ගැනීම සඳහා, ලෝකයේ අපගේ මානසික ආකෘතීන් නව දත්ත වලට අනුවර්තනය විය යුතුය, ඒවායින් සමහරක් නව මානයන් අඩංගු වේ - අප කලින් නොදැන සිටි දේවල් නිරීක්ෂණය කිරීමේ නව ක්‍රම. මෙම මානසික ආකෘතීන් අප විසින් නව තොරතුරු වර්ගීකරණය සහ සකසන ආකාරය තීරණය කරන වගු යෝජනා ක්‍රමවලට වඩා බෙහෙවින් වෙනස් නොවේ.

මෙය අපව යෝජනා ක්‍රම කළමනාකරණය පිළිබඳ ප්‍රශ්නයට ගෙන එයි. ව්‍යාපාරික අභියෝග සහ අවශ්‍යතා කාලයත් සමඟ වෙනස් වන විට, ඔබේ දත්තවල ව්‍යුහයද වෙනස් වේ. ඩෙල්ටා ලේක් දත්ත වෙනස් වන විට නව මිනුම් හඳුන්වා දීම පහසු කරයි. පරිශීලකයින්ට ඔවුන්ගේ වගු ක්‍රම කළමනාකරණය කිරීමට සරල අර්ථ ශාස්ත්‍ර වෙත ප්‍රවේශය ඇත. මෙම මෙවලම්වලට Schema Enforcement ඇතුළත් වේ, පරිශීලකයන් ඔවුන්ගේ වගු වැරදි හෝ අනවශ්‍ය දත්ත වලින් නොදැනුවත්ව දූෂණයෙන් ආරක්ෂා කරයි, සහ Schema Evolution, වටිනා දත්තවල නව තීරු සුදුසු ස්ථාන වෙත ස්වයංක්‍රීයව එක් කිරීමට ඉඩ සලසයි. මෙම ලිපියෙන් අපි මෙම මෙවලම් භාවිතා කිරීම ගැන ගැඹුරින් කිමිදෙමු.

වගු යෝජනා ක්රම අවබෝධ කර ගැනීම

Apache Spark හි ඇති සෑම DataFrame එකකම දත්ත වර්ග, තීරු සහ පාර-දත්ත වැනි දත්තවල ස්වරූපය නිර්වචනය කරන යෝජනා ක්‍රමයක් අඩංගු වේ. ඩෙල්ටා ලේක් සමඟින්, වගු ක්‍රමය ගනුදෙනු ලොගය තුළ JSON ආකෘතියෙන් ගබඩා කර ඇත.

යෝජනා ක්රමය ක්රියාත්මක කිරීම යනු කුමක්ද?

Schema Enforcement, Schema Validation ලෙසද හැඳින්වේ, මේසයේ යෝජනා ක්‍රමයට නොගැලපෙන වාර්තා ප්‍රතික්ෂේප කිරීමෙන් දත්තවල ගුණාත්මකභාවය සහතික කරන ඩෙල්ටා ලේක්හි ආරක්ෂක යාන්ත්‍රණයකි. ජනප්‍රිය වෙන්කරවා ගැනීමට පමණක් වන අවන්හලක ඉදිරිපස මේසයේ සිටින සේවිකාව මෙන්, ඇය මේසයට ඇතුළු කරන ලද සෑම දත්ත තීරුවක්ම අපේක්ෂිත තීරු ලැයිස්තුවේ (වෙනත් වචනවලින් කිවහොත්, ඒ සෑම එකක් සඳහාම "වෙන් කිරීමක්" තිබේද යන්න පරීක්ෂා කරයි. ), සහ ලැයිස්තුවේ නොමැති තීරු සහිත ඕනෑම වාර්තාවක් ප්‍රතික්ෂේප කරයි.

යෝජනා ක්‍රමය බලාත්මක කිරීම ක්‍රියා කරන්නේ කෙසේද?

Delta Lake විසින් schema-on-write checking භාවිතා කරයි, එයින් අදහස් කරන්නේ මේසයට ලියන සියලුම නව ලිවීම් ලිවීමේ වේලාවේදී ඉලක්ක වගුවේ schema සමඟ ගැළපීම සඳහා පරීක්ෂා කරන බවයි. යෝජනා ක්‍රමය අනනුකූල නම්, ඩෙල්ටා ලේක් ගණුදෙනුව සම්පූර්ණයෙන්ම නවත්වයි (දත්ත කිසිවක් ලියා නැත) සහ නොගැලපීම ගැන පරිශීලකයාට දැනුම් දීම සඳහා ව්‍යතිරේකයක් මතු කරයි.
වාර්තාවක් වගුවකට අනුකූලද යන්න තීරණය කිරීමට ඩෙල්ටා ලේක් පහත සඳහන් නීති භාවිතා කරයි. ලිවිය හැකි දත්ත රාමුව:

  • ඉලක්ක වගුවේ යෝජනා ක්‍රමයේ නොමැති අමතර තීරු අඩංගු විය නොහැක. අනෙක් අතට, ලැබෙන දත්තවල වගුවේ ඇති සියලුම තීරු සම්පූර්ණයෙන්ම අඩංගු නොවේ නම් සියල්ල හොඳයි - මෙම තීරු හුදෙක් ශුන්‍ය අගයන් පවරනු ලැබේ.
  • ඉලක්ක වගුවේ ඇති තීරු වල දත්ත වර්ග වලට වඩා වෙනස් තීරු දත්ත වර්ග තිබිය නොහැක. ඉලක්ක වගු තීරුවේ StringType දත්ත තිබේ නම්, නමුත් DataFrame හි අනුරූප තීරුවේ IntegerType දත්ත තිබේ නම්, schema බලාත්මක කිරීම ව්‍යතිරේකයක් දමා ලිවීමේ මෙහෙයුම සිදු වීම වළක්වයි.
  • නඩුවේදී පමණක් වෙනස් වන තීරු නම් අඩංගු විය නොහැක. මෙයින් අදහස් කරන්නේ ඔබට එකම වගුවක '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.

ස්වයංක්‍රීයව නව තීරු එකතු කරනවා වෙනුවට, ඩෙල්ටා ලේක් යෝජනා ක්‍රමයක් පනවන අතර ලිවීම නතර කරයි. විෂමතාවය ඇති කරන්නේ කුමන තීරුව (හෝ තීරු කුලකය) දැයි තීරණය කිරීමට උපකාර කිරීම සඳහා, Spark සංසන්දනය කිරීම සඳහා ස්කීමා දෙකම ප්‍රතිදානය කරයි.

යෝජනා ක්‍රමයක් ක්‍රියාත්මක කිරීමේ ප්‍රයෝජනය කුමක්ද?

යෝජනා ක්‍රම බලාත්මක කිරීම තරමක් දැඩි පරීක්ෂාවක් වන බැවින්, එය නිෂ්පාදනයට හෝ පරිභෝජනයට සුදානම් වූ පිරිසිදු, සම්පුර්ණයෙන්ම පරිණාමනය වූ දත්ත කට්ටලයකට දොරටු පාලකයෙකු ලෙස භාවිතා කිරීමට විශිෂ්ට මෙවලමකි. සාමාන්‍යයෙන් සෘජුවම දත්ත පෝෂණය කරන වගු සඳහා යොදනු ලැබේ:

  • යන්ත්‍ර ඉගෙනීමේ ඇල්ගොරිතම
  • BI උපකරණ පුවරු
  • දත්ත විශ්ලේෂණ සහ දෘශ්‍යකරණ මෙවලම්
  • ඉතා ව්‍යුහගත, දැඩි ලෙස ටයිප් කරන ලද අර්ථකථන ක්‍රම අවශ්‍ය ඕනෑම නිෂ්පාදන පද්ධතියක්.

මෙම අවසාන බාධකය සඳහා ඔවුන්ගේ දත්ත සකස් කිරීම සඳහා, බොහෝ පරිශීලකයින් ඔවුන්ගේ වගු තුළට ව්‍යුහය ක්‍රමයෙන් හඳුන්වා දෙන සරල "multi-hop" ගෘහ නිර්මාණ ශිල්පයක් භාවිතා කරයි. මේ ගැන වැඩි විස්තර සඳහා, ඔබට ලිපිය පරීක්ෂා කළ හැකිය ඩෙල්ටා ලේක් සමඟ නිෂ්පාදන ශ්‍රේණියේ යන්ත්‍ර ඉගෙනීම.

ඇත්ත වශයෙන්ම, යෝජනා ක්‍රමය බලාත්මක කිරීම ඔබේ නල මාර්ගයේ ඕනෑම තැනක භාවිතා කළ හැකිය, නමුත් මෙම නඩුවේ වගුවකට ප්‍රවාහය කිරීම කලකිරීමට හේතු විය හැකි බව මතක තබා ගන්න, උදාහරණයක් ලෙස, ඔබ එන දත්තවලට තවත් තීරුවක් එක් කළ බව ඔබට අමතක විය.

දත්ත දියාරු වීම වැළැක්වීම

මේ වන විට ඔබ කල්පනා කරනවා ඇති, මොකක්ද මේ අවුල? සියල්ලට පසු, සමහර විට අනපේක්ෂිත "ක්‍රමානුකුල නොගැලපීම" දෝෂයක් ඔබේ කාර්ය ප්‍රවාහය තුළ ඔබව අවුල් කළ හැකිය, විශේෂයෙන් ඔබ ඩෙල්ටා විලට අලුත් නම්. මට මගේ DataFrame කුමක් වුවත් ලිවීමට හැකි වන පරිදි අවශ්‍ය පරිදි යෝජනා ක්‍රමය වෙනස් කිරීමට ඉඩ නොදෙන්නේ මන්ද?

පැරණි කියමන පවසන පරිදි, "නිවාරණය අවුන්සයක් සුව කිරීමට රාත්තලක් වටී." යම් අවස්ථාවක දී, ඔබ ඔබේ යෝජනා ක්‍රමය බලාත්මක කිරීමට වග බලා නොගන්නේ නම්, දත්ත වර්ග අනුකූලතා ගැටලු ඔවුන්ගේ අවලස්සන හිස ඔසවනු ඇත - පෙනෙන පරිදි සමජාතීය අමු දත්ත මූලාශ්‍රවල දාර අවස්ථා, දූෂිත තීරු, විකෘති සිතියම්ගත කිරීම් හෝ සිහින දැකීමට වෙනත් බියජනක දේවල් අඩංගු විය හැකිය. නපුරු සිහින. හොඳම ප්‍රවේශය නම්, මෙම සතුරන් ගේට්ටුව ළඟ නවත්වා - ක්‍රම ක්‍රම ක්‍රියාත්මක කිරීමත් සමඟ - ඔවුන් ඔබේ නිෂ්පාදන කේතයේ අඳුරු ගැඹුරේ සැඟවී සිටීමට පටන් ගන්නා විට පසුව නොව, ආලෝකයේ ඔවුන් සමඟ ගනුදෙනු කිරීමයි.

ක්‍රමලේඛයක් බලාත්මක කිරීම ඔබ වෙනස් කිරීම අනුමත කරන්නේ නම් මිස ඔබේ වගුවේ යෝජනා ක්‍රමය වෙනස් නොවන බවට සහතිකයක් ලබා දේ. මෙය දත්ත දියාරු වීම වළක්වයි, නව තීරු නිතර නිතර එකතු කළ විට සිදු විය හැකි අතර කලින් වටිනා, සම්පීඩිත වගු දත්ත යටපත් වීම නිසා ඒවායේ තේරුම සහ ප්‍රයෝජනය නැති වේ. ඔබ චේතනාන්විතව සිටීමට, උසස් ප්‍රමිතීන් සැකසීමට සහ උසස් තත්ත්වයෙන් බලාපොරොත්තු වීමට දිරිගැන්වීමෙන්, යෝජනා ක්‍රම බලාත්මක කිරීම එය කිරීමට සැලසුම් කර ඇති දේ හරියටම කරයි—ඔබට හෘද සාක්ෂියට එකඟව සිටීමට සහ ඔබේ පැතුරුම්පත් පිරිසිදුව සිටීමට උදවු කරයි.

තවදුරටත් සලකා බැලීමෙන් ඔබ තීරණය කරන්නේ නම්, ඔබ ඇත්ත වශයෙන්ම අවශ්‍යයි නව තීරුවක් එක් කරන්න - ගැටලුවක් නැත, පහත ඇත්තේ එක් පේළියක විසඳුමක්. විසඳුම පරිපථයේ පරිණාමයයි!

ක්‍රම පරිණාමය යනු කුමක්ද?

Schema evolution යනු කාලයත් සමඟ වෙනස් වන දත්ත අනුව වත්මන් වගු සැලැස්ම පහසුවෙන් වෙනස් කිරීමට පරිශීලකයින්ට ඉඩ සලසන විශේෂාංගයකි. නව තීරු එකක් හෝ කිහිපයක් ඇතුළත් කිරීමට ස්කීමා ස්වයංක්‍රීයව අනුවර්තනය කිරීම සඳහා ඇමුණුම හෝ නැවත ලිවීමේ මෙහෙයුමක් සිදු කරන විට එය බොහෝ විට භාවිතා වේ.

ක්‍රම පරිණාමය ක්‍රියා කරන්නේ කෙසේද?

පෙර කොටසේ ආදර්ශය අනුගමනය කරමින්, සංවර්ධකයින්ට යෝජනා ක්‍රම අනනුකූලතාවය හේතුවෙන් කලින් ප්‍රතික්ෂේප කරන ලද නව තීරු එකතු කිරීමට ක්‍රම පරිණාමය පහසුවෙන් භාවිතා කළ හැක. පරිපථ පරිණාමය එකතු කිරීම මගින් සක්රිය කර ඇත .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 වින්‍යාසය වෙත. නමුත් මෙය ප්‍රවේශමෙන් භාවිතා කරන්න, මන්ද ක්‍රම ක්‍රම බලාත්මක කිරීම ඔබට නොදැනුවත්වම ක්‍රමානුකූලව නොගැලපීම් ගැන අනතුරු අඟවන්නේ නැත.

ඉල්ලීමෙහි පරාමිතිය ඇතුළත් කිරීමෙන් mergeSchema, DataFrame හි ඇති නමුත් ඉලක්ක වගුවේ නොමැති සියලුම තීරු ලිවීමේ ගනුදෙනුවක කොටසක් ලෙස ස්කීමාවේ අවසානයට ස්වයංක්‍රීයව එකතු වේ. නෙස්ටඩ් ක්ෂේත්‍ර ද එකතු කළ හැකි අතර මේවා අනුරූප ව්‍යුහයේ තීරුවල අවසානයට ද එකතු වේ.

දත්ත ඉංජිනේරුවන්ට සහ දත්ත විද්‍යාඥයින්ට පැරණි තීරු මත පදනම්ව පවතින ආකෘති බිඳ දැමීමකින් තොරව ඔවුන්ගේ පවතින යන්ත්‍ර ඉගෙනුම් නිෂ්පාදන වගු වෙත නව තීරු (සමහරවිට මෑතදී නිරීක්ෂණය කරන ලද මෙට්‍රික් හෝ මේ මාසයේ විකුණුම් කාර්ය සාධන තීරුවක්) එක් කිරීමට මෙම විකල්පය භාවිත කළ හැක.

වගු එකතු කිරීමේදී හෝ නැවත ලිවීමේදී ක්‍රම පරිණාමයේ කොටසක් ලෙස පහත ආකාරයේ ක්‍රම වෙනස් කිරීම් වලට ඉඩ දෙනු ලැබේ:

  • නව තීරු එකතු කිරීම (මෙය වඩාත් පොදු අවස්ථාවයි)
  • NullType -> වෙනත් ඕනෑම වර්ගයකින් දත්ත වර්ග වෙනස් කිරීම හෝ ByteType -> ShortType -> IntegerType වෙතින් ප්‍රවර්ධනය කිරීම

යෝජනා ක්‍රම පරිණාමය තුළ ඉඩ නොදෙන අනෙකුත් වෙනස්කම් සඳහා ක්‍රමලේඛය සහ දත්ත එකතු කිරීමෙන් නැවත ලිවීම අවශ්‍ය වේ .option("overwriteSchema", "true"). උදාහරණයක් ලෙස, "Foo" තීරුව මුලින් පූර්ණ සංඛ්‍යාවක් වූ විට සහ නව ක්‍රමලේඛය තන්තු දත්ත වර්ගයක් වූ විට, සියලුම Parquet(data) ගොනු නැවත ලිවිය යුතු වේ. එවැනි වෙනස්කම් වලට ඇතුළත් වන්නේ:

  • තීරුවක් මකා දැමීම
  • පවතින තීරුවක දත්ත වර්ගය වෙනස් කිරීම (ස්ථානයේ)
  • අවස්ථා වලදී පමණක් වෙනස් වන තීරු නැවත නම් කිරීම (උදාහරණයක් ලෙස, "Foo" සහ "foo")

අවසාන වශයෙන්, Spark 3.0 හි මීළඟ නිකුතුව සමඟින්, පැහැදිලි DDL සම්පූර්ණයෙන් සහාය දක්වනු ඇත (ALTER TABLE භාවිතයෙන්), පරිශීලකයින්ට වගු ක්‍රම මත පහත ක්‍රියා සිදු කිරීමට ඉඩ ලබා දේ:

  • තීරු එකතු කිරීම
  • තීරු අදහස් වෙනස් කිරීම
  • ගනුදෙනු ලොගයක් ගබඩා කර ඇති කාල සීමාව සැකසීම වැනි වගුවේ හැසිරීම පාලනය කරන වගු ගුණාංග සැකසීම.

පරිපථ පරිණාමයේ වාසිය කුමක්ද?

ක්‍රම පරිණාමය ඔබ ඕනෑම අවස්ථාවක භාවිතා කළ හැක අදහස් ඔබගේ වගුවේ යෝජනා ක්‍රමය වෙනස් කරන්න (ඔබ අහම්බෙන් ඔබේ DataFrame වෙත එහි නොතිබිය යුතු තීරු එකතු කළ විට ඊට ප්‍රතිවිරුද්ධව). මෙය පැහැදිලිව ප්‍රකාශ කිරීමකින් තොරව නිවැරදි තීරු නම් සහ දත්ත වර්ග ස්වයංක්‍රීයව එක් කරන නිසා ඔබේ ක්‍රමලේඛය සංක්‍රමණය කිරීමට ඇති පහසුම ක්‍රමය මෙයයි.

නිගමනය

යෝජනා ක්‍රම බලාත්මක කිරීම ඔබගේ වගුව සමඟ නොගැලපෙන ඕනෑම නව තීරු හෝ වෙනත් යෝජනා ක්‍රම වෙනස් කිරීම් ප්‍රතික්ෂේප කරයි. මෙම උසස් ප්‍රමිතීන් සැකසීම සහ පවත්වාගෙන යාමෙන්, විශ්ලේෂකයින්ට සහ ඉංජිනේරුවන්ට ඔවුන්ගේ දත්තවල අඛණ්ඩතාව ඉහළම මට්ටමේ පවතින බව විශ්වාස කළ හැකිය, එය පැහැදිලිව සහ පැහැදිලිව සන්නිවේදනය කරමින්, වඩා හොඳ ව්‍යාපාරික තීරණ ගැනීමට ඔවුන්ට ඉඩ සලසයි.

අනෙක් අතට, ක්‍රම පරිණාමය සරල කිරීම මගින් බලාත්මක කිරීම සම්පූර්ණ කරයි චෝදනා කළා ස්වයංක්‍රීය ක්‍රම වෙනස්වීම්. සියල්ලට පසු, තීරුවක් එකතු කිරීම අපහසු නොවිය යුතුය.

යෝජනා ක්‍රමයේ බලහත්කාර යෙදුම යැං වන අතර, යෝජනා ක්‍රමයේ පරිණාමය යින් වේ. එකට භාවිතා කරන විට, මෙම විශේෂාංග ශබ්දය යටපත් කිරීම සහ සංඥා සුසර කිරීම වෙන කවරදාටත් වඩා පහසු කරයි.

මෙම ලිපියට දායක වූ මුකුල් මූර්ති සහ ප්‍රනාව් ආනන්ද්ට ද අපගේ ස්තූතිය පුද කරන්නෙමු.

මෙම ලිපි මාලාවේ අනෙකුත් ලිපි:

ඩෙල්ටා විලට කිමිදෙන්න: ගනුදෙනු ලොගය ඉවත් කිරීම

අදාළ ලිපි

ඩෙල්ටා ලේක් සමඟ නිෂ්පාදන ශ්‍රේණියේ යන්ත්‍ර ඉගෙනීම

දත්ත විලක් යනු කුමක්ද?

පාඨමාලාව ගැන වැඩි විස්තර දැනගන්න

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න