ወደ ዴልታ ሐይቅ ይዝለሉ፡ የመርሃግብር ማስፈጸሚያ እና ዝግመተ ለውጥ

ሃይ ሀብር! የጽሁፉን ትርጉም ለእርስዎ ትኩረት አቀርባለሁ። "ወደ ዴልታ ሀይቅ ዘልቆ መግባት፡ የመርሃግብር ማስፈጸሚያ እና ዝግመተ ለውጥ" የትምህርቱን መጀመሪያ በመጠባበቅ የተዘጋጀው ደራሲ ቡራክ ያቩዝ፣ ብሬነር ሄንትዝ እና ዴኒ ሊ የውሂብ መሐንዲስ ከ OTUS.

ወደ ዴልታ ሐይቅ ይዝለሉ፡ የመርሃግብር ማስፈጸሚያ እና ዝግመተ ለውጥ

መረጃ ልክ እንደእኛ ልምድ ያለማቋረጥ እየተጠራቀመ እና እየተሻሻለ ነው። ለመቀጠል፣ የእኛ የአለም አእምሯዊ ሞዴሎች ከአዳዲስ መረጃዎች ጋር መላመድ አለባቸው፣ ከእነዚህም ውስጥ አንዳንዶቹ አዲስ ልኬቶችን - ከዚህ በፊት የማናውቃቸውን አዳዲስ ነገሮችን የምናስተውልባቸው መንገዶች። እነዚህ የአዕምሮ ሞዴሎች አዲስ መረጃን እንዴት እንደምንከፋፈል እና እንደምናስተናግድ ከሚወስኑት የሰንጠረዥ ንድፎች ብዙም የተለዩ አይደሉም።

ይህ ወደ ሼማ አስተዳደር ጉዳይ ያመጣናል። የንግድ ፈተናዎች እና መስፈርቶች በጊዜ ሂደት ሲለዋወጡ፣ የውሂብዎ መዋቅርም እንዲሁ ነው። ዴልታ ሌክ መረጃ ሲቀየር አዳዲስ መለኪያዎችን ማስተዋወቅ ቀላል ያደርገዋል። ተጠቃሚዎች የሰንጠረዥ እቅዶቻቸውን ለማስተዳደር ቀለል ያሉ የትርጓሜ ትምህርቶችን ማግኘት ይችላሉ። እነዚህ መሳሪያዎች ተጠቃሚዎች ባለማወቅ ጠረጴዛዎቻቸውን በስህተቶች ወይም አላስፈላጊ መረጃዎች እንዳይበክሉ የሚከላከለው Schema Enforcement እና የ Schema Evolution (Schema Evolution) የሚያካትቱት ሲሆን ይህም አዳዲስ ጠቃሚ መረጃዎችን አምዶች በተገቢው ቦታ ላይ እንዲጨምሩ ያስችላቸዋል። በዚህ ጽሑፍ ውስጥ እነዚህን መሳሪያዎች ለመጠቀም በጥልቀት እንገባለን.

የሠንጠረዥ መርሃግብሮችን መረዳት

በApache Spark ውስጥ ያለ እያንዳንዱ የውሂብ ፍሬም እንደ የውሂብ አይነቶች፣ ዓምዶች እና ዲበ ውሂብ ያሉ የውሂቡን ቅርጽ የሚገልጽ ንድፍ ይዟል። ከዴልታ ሌክ ጋር፣ የጠረጴዛው ንድፍ በJSON ቅርጸት በግብይት ምዝግብ ማስታወሻ ውስጥ ተከማችቷል።

እቅድ ማስፈጸሚያ ምንድን ነው?

Schema Enforcement፣ እንዲሁም Schema Validation በመባል የሚታወቀው፣ በዴልታ ሃይቅ ውስጥ ከጠረጴዛው እቅድ ጋር የማይዛመዱ መዝገቦችን ውድቅ በማድረግ የመረጃ ጥራትን የሚያረጋግጥ የደህንነት ዘዴ ነው። በታዋቂው የመጠባበቂያ ብቻ ሬስቶራንት የፊት ዴስክ ላይ እንደምትገኝ አስተናጋጅ፣ ወደ ጠረጴዛው የገባው እያንዳንዱ የውሂብ አምድ በሚጠበቁት አምዶች ዝርዝር ውስጥ መሆኑን ትፈትሻለች (በሌላ አነጋገር ለእያንዳንዳቸው “ቦታ ማስያዝ” አለ ወይ? ) እና በዝርዝሩ ውስጥ የሌሉ ዓምዶች ያሏቸውን መዝገቦች ውድቅ ያደርጋል።

የመርሃግብር ማስፈጸሚያ እንዴት ነው የሚሰራው?

ዴልታ ሌክ ሼማ-በ-ጽሑፍ ማጣራትን ይጠቀማል፣ ይህ ማለት ሁሉም አዲስ ወደ ሠንጠረዡ የተጻፉት በጽሑፍ ጊዜ ከዒላማ ሠንጠረዡ ንድፍ ጋር ተኳሃኝነት እንዳላቸው ይጣራሉ። መርሃግብሩ ወጥነት የሌለው ከሆነ፣ ዴልታ ሌክ ግብይቱን ሙሉ በሙሉ ያቋርጣል (ምንም መረጃ አልተፃፈም) እና አለመጣጣሙን ለተጠቃሚው ለማሳወቅ ልዩ ሁኔታን ይፈጥራል።
ዴልታ ሌክ መዝገብ ከጠረጴዛ ጋር ተኳሃኝ መሆኑን ለመወሰን የሚከተሉትን ህጎች ይጠቀማል። ሊፃፍ የሚችል የውሂብ ፍሬም

  • በዒላማው ሰንጠረዥ ንድፍ ውስጥ የሌሉ ተጨማሪ ዓምዶችን ሊይዝ አይችልም. በተቃራኒው ፣ ገቢው መረጃ ከሠንጠረዡ ውስጥ ያሉትን አምዶች ሙሉ በሙሉ ካልያዘ ሁሉም ነገር ጥሩ ነው - እነዚህ አምዶች በቀላሉ ባዶ እሴቶችን ይመደባሉ ።
  • በዒላማው ሠንጠረዥ ውስጥ ካሉት የአምዶች የውሂብ ዓይነቶች የተለዩ የአምድ ውሂብ ዓይነቶች ሊኖሩት አይችሉም። የዒላማ ሠንጠረዡ ዓምድ StringType ውሂብን ከያዘ፣ነገር ግን በዳታፍሬም ውስጥ ያለው ተዛማጅ ዓምድ IntegerType ውሂብን ከያዘ፣የሼማ ማስፈጸሚያ ልዩ ሁኔታን ይጥላል እና የአጻጻፍ ክዋኔው እንዳይካሄድ ይከለክላል።
  • በአጋጣሚ ብቻ የሚለያዩ የአምድ ስሞችን ሊይዝ አይችልም። ይህ ማለት በተመሳሳይ ሠንጠረዥ ውስጥ 'ፉ' እና 'foo' የሚባሉ ዓምዶች ሊኖሩዎት አይችሉም። ስፓርክ በጉዳይ-sensitive ወይም case-insensitive (ነባሪ) ሁነታ፣ ዴልታ ሌክ ኬዝ ተጠብቆ ነው ነገር ግን በእቅድ ማከማቻው ውስጥ ደንታ የሌለው ነው። የአምድ መረጃን ሲያከማች እና ሲመለስ ፓርኬት ጉዳዩን ሚስጥራዊነት አለው። ሊሆኑ የሚችሉ ስህተቶችን፣ የውሂብ መበላሸትን ወይም የውሂብ መጥፋትን ለማስወገድ (በእኛ በዳታብሪክስ በግላችን ያጋጠመን ነገር) ይህንን ገደብ ለመጨመር ወስነናል።

ይህንን በምሳሌ ለማስረዳት፣ አዲስ የተፈጠሩ አምዶችን ለመቀበል ገና ያልተዋቀረ በዴልታ ሃይቅ ጠረጴዛ ላይ ለመጨመር ስንሞክር ከዚህ በታች ባለው ኮድ ውስጥ ምን እንደሚፈጠር እንይ።

# Сгенерируем 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 ዳሽቦርዶች
  • የውሂብ ትንታኔ እና የእይታ መሣሪያዎች
  • በከፍተኛ ደረጃ የተዋቀረ፣ በጠንካራ መልኩ የተተየቡ የትርጉም ንድፎችን የሚፈልግ ማንኛውም የምርት ስርዓት።

ለዚህ የመጨረሻ መሰናክል ውሂባቸውን ለማዘጋጀት፣ ብዙ ተጠቃሚዎች ቀስ በቀስ መዋቅርን ወደ ጠረጴዛዎቻቸው የሚያስተዋውቅ ቀላል “ባለብዙ ​​ሆፕ” አርክቴክቸር ይጠቀማሉ። ስለዚህ ጉዳይ የበለጠ ለማወቅ, ጽሑፉን ማየት ይችላሉ የማምረቻ ደረጃ የማሽን ትምህርት ከዴልታ ሐይቅ ጋር።

እርግጥ ነው፣ የመርሃግብር ማስፈጸሚያ በቧንቧ መስመርዎ ውስጥ በማንኛውም ቦታ መጠቀም ይቻላል፣ ነገር ግን በዚህ ጉዳይ ላይ ወደ ጠረጴዛ መልቀቅ ተስፋ አስቆራጭ ሊሆን እንደሚችል ያስታውሱ ምክንያቱም ለምሳሌ፣ በሚመጣው ውሂብ ላይ ሌላ አምድ እንዳከሉ ረስተዋል።

የውሂብ dilution መከላከል

አሁን ላይ ትጠይቅ ይሆናል፣ ግርግሩ ምንድን ነው? ለነገሩ፣ አንዳንድ ጊዜ ያልተጠበቀ የ"schema mismatch" ስህተት በስራ ሂደትህ ላይ ሊያደናቅፍህ ይችላል፣በተለይ ለዴልታ ሀይቅ አዲስ ከሆንክ። ለምንድነው ምንም ቢሆን የእኔን DataFrame መፃፍ እንድችል ንድፉ እንደ አስፈላጊነቱ እንዲቀየር አልፈቅድም?

የድሮው አባባል እንደሚባለው፣ “አንድ ኦውንስ መከላከል የአንድ ፓውንድ መድኃኒት ዋጋ አለው። አንዳንድ ጊዜ፣ እቅድህን ለማስፈጸም ካልተጠነቀቅክ የውሂብ አይነት ተኳሃኝነት ጉዳዮች አስቀያሚ ጭንቅላታቸውን ያስከትላሉ - ተመሳሳይ የሚመስሉ ጥሬ የመረጃ ምንጮች የጠርዝ ጉዳዮችን፣ የተበላሹ ዓምዶችን፣ የተበላሹ ካርታዎችን ወይም ሌሎች በህልም የሚመለከቷቸውን አስፈሪ ነገሮች ሊይዙ ይችላሉ። ቅዠቶች. በጣም ጥሩው አካሄድ እነዚህን ጠላቶች በበሩ ላይ ማቆም ነው - ከመርሃግብር ማስፈጸሚያ ጋር - እና እነሱን በብርሃን ማስተናገድ ፣ ይልቁንም ከጊዜ በኋላ በምርት ኮድዎ ውስጥ ጨለማ ውስጥ መደበቅ ሲጀምሩ።

ንድፍን ማስፈጸም ለውጡን እስካልፈቀዱ ድረስ የጠረጴዛዎ እቅድ እንደማይለወጥ ማረጋገጫ ይሰጥዎታል። ይህ የውሂብ መሟሟትን ይከላከላል፣ ይህም አዳዲስ ዓምዶች በጣም በተደጋጋሚ ሲታከሉ ሊከሰት ስለሚችል ከዚህ ቀደም ዋጋ ያላቸው፣ የታመቁ ጠረጴዛዎች በውሂብ መጥለቅለቅ ምክንያት ትርጉማቸውን እና ጠቀሜታቸውን ያጣሉ። እርስዎን ሆን ብለው እንዲያስቡ፣ ከፍተኛ ደረጃዎችን እንዲያወጡ እና ከፍተኛ ጥራት እንዲጠብቁ በማበረታታት፣ የመርሃግብር ማስፈጸሚያ በትክክል ለመስራት የተነደፈውን ያደርጋል - በትጋት እንዲቆዩ እና የተመን ሉሆችዎ ንጹህ እንዲሆኑ ያግዝዎታል።

ተጨማሪ ግምት ውስጥ ከገባህ ​​በትክክል እንደሆንክ ከወሰንክ አስፈላጊ አዲስ አምድ ጨምር - ምንም ችግር የለም፣ ከታች ባለ አንድ መስመር ማስተካከያ አለ። መፍትሄው የወረዳው ዝግመተ ለውጥ ነው!

schema ዝግመተ ለውጥ ምንድን ነው?

የሼማ ኢቮሉሽን ተጠቃሚዎች በጊዜ ሂደት በሚለዋወጠው መረጃ መሰረት አሁን ያለውን የሠንጠረዥ ንድፍ በቀላሉ እንዲቀይሩ የሚያስችል ባህሪ ነው። አንድ ወይም ከዚያ በላይ አዲስ አምዶችን ለማካተት ንድፉን በራስ-ሰር ለማስማማት አባሪ ወይም እንደገና ለመፃፍ ሲሰራ ብዙ ጊዜ ጥቅም ላይ ይውላል።

የ schema ዝግመተ ለውጥ እንዴት ይሠራል?

ካለፈው ክፍል ያለውን ምሳሌ በመከተል ገንቢዎች ቀደም ሲል በሼማ አለመመጣጠን ምክንያት ውድቅ የተደረጉ አዳዲስ አምዶችን ለመጨመር 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.databricks.delta.schema.autoMerge = True ወደ Spark ውቅር. ነገር ግን ይህንን በጥንቃቄ ተጠቀምበት፣ ምክንያቱም የሼማ ማስፈጸሚያ ከአሁን በኋላ ወደ ያልታሰበ የሼማ አለመመጣጠን ስለሚያስጠነቅቅህ።

በጥያቄው ውስጥ መለኪያውን በማካተት mergeSchema, በ DataFrame ውስጥ ያሉ ነገር ግን በዒላማው ሠንጠረዥ ውስጥ የሌሉ ሁሉም ዓምዶች እንደ የጽሑፍ ግብይት አካል ሆነው በቀጥታ ወደ መርሃግብሩ መጨረሻ ይታከላሉ። የጎጆ ማሳዎች እንዲሁ ሊጨመሩ ይችላሉ እና እነዚህም ወደ ተጓዳኝ መዋቅር አምዶች መጨረሻ ይታከላሉ።

የቀን መሐንዲሶች እና የዳታ ሳይንቲስቶች ይህንን አማራጭ በመጠቀም አዳዲስ አምዶችን (ምናልባትም በቅርብ ክትትል የሚደረግበት ሜትሪክ ወይም የዚህ ወር የሽያጭ አፈፃፀም አምድ) አሁን ባሉት የማሽን መማሪያ ማምረቻ ሰንጠረዦች ላይ በአሮጌ አምዶች ላይ ተመስርተው ያሉትን ሞዴሎች ሳይሰብሩ ሊጠቀሙበት ይችላሉ።

በሰንጠረዥ ሲጨመር ወይም እንደገና በሚፃፍበት ጊዜ የሚከተሉት የመርሃግብር ለውጦች እንደ የሼማ ዝግመተ ለውጥ አካል ይፈቀዳሉ፡

  • አዲስ አምዶችን ማከል (ይህ በጣም የተለመደው ሁኔታ ነው)
  • የውሂብ አይነቶችን ከNulType መቀየር -> ሌላ አይነት ወይም ከ ByteType -> ShortType -> IntegerType ማስተዋወቅ

በ schema ዝግመተ ለውጥ ውስጥ ያልተፈቀዱ ሌሎች ለውጦች ንድፉ እና ውሂቡ በማከል እንደገና መፃፍ አለባቸው .option("overwriteSchema", "true"). ለምሳሌ፣ "ፉ" የሚለው አምድ በመጀመሪያ ኢንቲጀር በሆነበት እና አዲሱ እቅድ የሕብረቁምፊ ውሂብ ዓይነት በሆነበት ሁኔታ፣ ሁሉም የፓርኬት(ዳታ) ፋይሎች እንደገና መፃፍ አለባቸው። እንደነዚህ ያሉ ለውጦች የሚከተሉትን ያካትታሉ:

  • አንድ አምድ መሰረዝ
  • የአንድን አምድ የውሂብ አይነት መለወጥ (በቦታው)
  • በጉዳዩ ላይ ብቻ የሚለያዩትን አምዶች እንደገና መሰየም (ለምሳሌ “ፉ” እና “ፉ”)

በመጨረሻም፣ በሚቀጥለው የስፓርክ 3.0 መለቀቅ፣ ግልጽ ዲዲኤል ሙሉ በሙሉ ይደገፋል (ALTER TABLEን በመጠቀም) ተጠቃሚዎች የሚከተሉትን እርምጃዎች በሰንጠረዥ ንድፎች ላይ እንዲያደርጉ ያስችላቸዋል።

  • አምዶች መጨመር
  • የአምድ አስተያየቶችን መቀየር
  • የሰንጠረዡን ባህሪ የሚቆጣጠሩ የሰንጠረዥ ባህሪያትን ማቀናበር፣ ለምሳሌ የግብይት ምዝግብ ማስታወሻ የሚቀመጥበትን ጊዜ ማቀናበር።

የወረዳ ዝግመተ ለውጥ ጥቅም ምንድነው?

የ Schema ዝግመተ ለውጥ በማንኛውም ጊዜ መጠቀም ይቻላል። አስብ የሠንጠረዡን ንድፍ ይቀይሩ (በስህተት ወደ ዳታ ፍሬምዎ እዚያ መሆን የማይገባቸው ዓምዶችን ካከሉ ​​በተቃራኒ)። ይህ እቅድዎን ለማዛወር ቀላሉ መንገድ ነው ምክንያቱም ትክክለኛዎቹን የአምድ ስሞች እና የውሂብ አይነቶችን በግልፅ ሳያሳውቅ በራስ-ሰር ስለሚጨምር።

መደምደሚያ

የመርሃግብር ማስፈጸሚያ ማናቸውንም አዳዲስ አምዶች ወይም ሌሎች ከጠረጴዛዎ ጋር ተኳሃኝ ያልሆኑ የመርሃግብር ለውጦችን ውድቅ ያደርጋል። እነዚህን ከፍተኛ ደረጃዎች በማዘጋጀት እና በመጠበቅ፣ ተንታኞች እና መሐንዲሶች ውሂባቸው ከፍተኛው የታማኝነት ደረጃ እንዳለው፣ በግልፅ እና በግልፅ በመገናኘት፣ የተሻሉ የንግድ ውሳኔዎችን እንዲወስኑ ያስችላቸዋል።

በሌላ በኩል፣ schema ዝግመተ ለውጥ በማቃለል ተፈጻሚነትን ያሟላል። ተከሰሰ ራስ-ሰር ንድፍ ለውጦች. ከሁሉም በላይ, አንድ አምድ ማከል አስቸጋሪ መሆን የለበትም.

የመርሃግብሩ የግዳጅ ትግበራ ያንግ ነው, የእቅዱ ዝግመተ ለውጥ ዪን ነው. እነዚህ ባህሪያት አንድ ላይ ጥቅም ላይ ሲውሉ የድምፅ መከላከያ እና የምልክት ማስተካከያ ከመቼውም ጊዜ በበለጠ ቀላል ያደርጉታል።

እንዲሁም ሙኩል ሙርቲ እና ፕራናቭ አናንድ ለዚህ ፅሁፍ ላበረከቱት አስተዋፅዖ ማመስገን እንፈልጋለን።

በዚህ ተከታታይ ውስጥ ያሉ ሌሎች ጽሑፎች፡-

ወደ ዴልታ ሐይቅ ዘልቀው ይግቡ፡ የግብይት ምዝግብ ማስታወሻውን በማራገፍ ላይ

በርዕሱ ላይ ጽሑፎች

የማምረቻ ደረጃ የማሽን ትምህርት ከዴልታ ሐይቅ ጋር

የውሂብ ሐይቅ ምንድን ነው?

ስለ ኮርሱ የበለጠ ይወቁ

ምንጭ: hab.com

አስተያየት ያክሉ