الغوص في بحيرة دلتا: الإنفاذ والتطور

مرحبا يا هابر! أقدم لكم ترجمة مقالة "الغوص في بحيرة دلتا: تنفيذ المخطط والتطور" بقلم بوراك يافوز وبرينر هاينتس وديني لي ، والتي تم إعدادها مسبقًا قبل بدء دورة مهندس البيانات من OTUS.





البيانات ، مثل تجربتنا ، تتراكم وتتطور باستمرار. من أجل مواكبة ذلك ، يجب أن تتكيف نماذجنا العقلية للعالم مع البيانات الجديدة ، التي يحتوي بعضها على أبعاد جديدة - طرق جديدة لمراقبة الأشياء التي لم تكن لدينا فكرة عنها من قبل. لا تختلف هذه النماذج العقلية كثيرًا عن مخططات الجداول التي تحدد كيفية تصنيف ومعالجة المعلومات الجديدة.

هذا يقودنا إلى قضية إدارة الدوائر. مع تغير مهام العمل ومتطلباته بمرور الوقت ، تتغير بنية بياناتك. تسهل Delta Lake تنفيذ قياسات جديدة عند تغيير البيانات. يمكن للمستخدمين الوصول إلى دلالات بسيطة لإدارة تخطيطات جداولهم. تتضمن هذه الأدوات تطبيق Schema Enforcement ، الذي يحمي المستخدمين من انسداد طاولاتهم دون قصد بالأخطاء أو البيانات غير الضرورية ، بالإضافة إلى Schema Evolution ، الذي يضيف تلقائيًا أعمدة جديدة ببيانات قيمة إلى الأماكن المناسبة. في هذه المقالة ، سنتعمق في استخدام هذه الأدوات.

فهم مخططات الجدول


يحتوي كل DataFrame في Apache Spark على مخطط يحدد نموذج بيانات ، مثل أنواع البيانات والأعمدة والبيانات الوصفية. باستخدام Delta Lake ، يتم حفظ مخطط الجدول بتنسيق JSON داخل سجل المعاملات.

ما هو تطبيق المخطط؟


تطبيق المخطط ، المعروف أيضًا باسم التحقق من المخطط ، هو آلية دفاع في Delta Lake تضمن جودة البيانات من خلال رفض السجلات التي لا تتطابق مع مخطط الجدول. مثل المضيفة في مكتب الاستقبال في مطعم شهير ، والذي يقبل فقط عن طريق الحجز المسبق ، يتحقق من معرفة ما إذا كان كل عمود من البيانات التي تم إدخالها في الجدول موجودًا في قائمة الأعمدة المتوقعة المقابلة (وبعبارة أخرى ، هل هناك "حجز" لكل منها) ، ويرفض أي إدخالات بأعمدة غير مدرجة في القائمة.

كيف يعمل فرض الدائرة؟


تستخدم Delta Lake فحص مخطط عند الكتابة ، مما يعني أن جميع السجلات الجديدة في الجدول يتم فحصها للتوافق مع مخطط الجدول الهدف أثناء التسجيل. إذا كان المخطط غير متوافق ، تقوم دلتا ليك بإلغاء المعاملة تمامًا (لم تتم كتابة البيانات) وتلقي استثناء لإبلاغ المستخدم بشأن التناقض.
لتحديد توافق السجل مع جدول ، تستخدم Delta Lake القواعد التالية. إطار بيانات قابل للكتابة:

  • لا يمكن أن تحتوي على أعمدة إضافية غير موجودة في مخطط الجدول الهدف. والعكس صحيح ، كل شيء في محله إذا كانت بيانات الإدخال لا تحتوي على جميع الأعمدة من الجدول - سيتم تعيين هذه الأعمدة بقيم صفرية.
  • , . StringType, DataFrame IntegerType, .
  • لا يمكن أن تحتوي على أسماء الأعمدة التي تختلف فقط في الحالة. هذا يعني أنه لا يمكن أن يكون لديك أعمدة تحمل الاسمين "Foo" و "foo" في نفس الجدول. على الرغم من أن Spark يمكن استخدامه في حالة الأحرف أو غير حساسة لحالة الأحرف (افتراضي) ، إلا أن Delta Lake حساسة لحالة الأحرف ، ولكنها غير حساسة لحالة الأحرف. الباركيه حساس لحالة الأحرف عند تخزين معلومات العمود وإرجاعها. من أجل تجنب الأخطاء المحتملة أو تلف البيانات أو فقدان البيانات (التي واجهناها شخصيًا في قواعد البيانات) ، قررنا إضافة هذا التقييد.

لتوضيح هذا ، دعنا نلقي نظرة على ما يحدث في الرمز أدناه عند محاولة إضافة بعض الأعمدة التي تم إنشاؤها مؤخرًا إلى جدول Delta Lake لم يتم تكوينه بعد لقبولها.

#  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.

بدلاً من إضافة أعمدة جديدة تلقائيًا ، تفرض Delta Lake مخططًا وتوقف التسجيل. للمساعدة في تحديد العمود (أو تعددها) هو سبب عدم التطابق ، يقوم Spark بسحب كلا المخططين من مكدس المكدس للمقارنة.

ما فائدة تطبيق مخطط؟


نظرًا لأن فرض المخطط هو اختبار صارم إلى حد ما ، فهو أداة ممتازة لاستخدام مجموعة بيانات نظيفة ومحوّلة بالكامل جاهزة للإنتاج أو الاستهلاك كحارس بوابة. كقاعدة ، يتم تطبيقه على الجداول التي توفر البيانات مباشرة:

  • خوارزميات التعلم الآلي
  • لوحات معلومات BI
  • أدوات تحليلات البيانات والتصور
  • أي نظام إنتاج يتطلب مخططات دلالية دقيقة للغاية ومكتوبة.

لإعداد بياناتهم لهذا الحاجز النهائي ، يستخدم العديد من المستخدمين بنية بسيطة متعددة القفزات ، والتي تجلب الهيكل إلى جداولهم تدريجيًا. لمعرفة المزيد حول هذا ، يمكنك الاطلاع على مقالة التعلم الآلي على مستوى الماكينة في Delta Lake.

بالطبع ، يمكنك استخدام التطبيق القسري للنظام في أي مكان في خط الأنابيب الخاص بك ، ولكن تذكر أن التدفق إلى جدول في هذه الحالة يمكن أن يكون محبطًا ، لأنه ، على سبيل المثال ، نسيت أنك أضفت عمودًا آخر إلى بيانات الإدخال.

منع ترقق البيانات


عند هذه النقطة ، قد تتساءل لماذا مثل هذه الضجة؟ بعد كل شيء ، في بعض الأحيان يمكن أن يؤدي خطأ "عدم تطابق المخطط" غير المتوقع إلى إعدادك على عربة النطاق في سير عملك ، خاصة إذا كنت جديدًا في Delta Lake. لماذا لا تسمح فقط بتغيير المخطط حسب الحاجة حتى أتمكن من كتابة DataFrame الخاص بي ، بغض النظر عن ماذا؟

وكما يقول المثل القديم ، "أوقية الوقاية تستحق رطلاً من العلاج". في مرحلة ما ، إذا كنت لا تهتم بتطبيق نظامك ، فإن مشاكل توافق نوع البيانات ستثير رؤوسك المثيرة للاشمئزاز - للوهلة الأولى ، قد تحتوي مصادر البيانات الخام المتجانسة على حالات حدودية ، أو أعمدة تالفة ، أو خرائط مشوهة ، أو أشياء مخيفة أخرى تحلم بها في الكوابيس. أفضل طريقة هي إيقاف هؤلاء الأعداء عند البوابة - عن طريق فرض المخطط - والتعامل معهم في الضوء ، وليس في وقت لاحق ، عندما يبدأون في البحث في الأعماق المظلمة لرمز عملك.

يمنحك فرض المخطط الثقة بأن مخطط الجدول الخاص بك لن يتغير ، إلا إذا قمت بتأكيد خيار التغيير بنفسك. هذا يمنع تمييع البيانات التي يمكن أن تحدث عند إضافة أعمدة جديدة في كثير من الأحيان بحيث تفقد الجداول المضغوطة ذات القيمة السابقة قيمتها وفائدتها بسبب تدفق البيانات. تشجيعك على أن تكون متعمدًا ، وتعيين معايير عالية وتوقع جودة عالية ، وإن تنفيذ المخطط يفعل بالضبط ما كان يهدف إلى مساعدتك في الحفاظ على الصدق ، والحفاظ على نظافة طاولاتك.

إذا قررت ، بعد مزيد من الدراسة ، أنك تحتاج حقًا إلى إضافة عمود جديد - لا توجد مشكلة ، فيما يلي إصلاح لخط واحد. الحل هو تطور الدائرة!

ما هو تطور الدائرة؟


تطور المخطط هو ميزة تسمح للمستخدمين بتغيير مخطط الجدول الحالي بسهولة وفقًا للبيانات التي تتغير بمرور الوقت. في معظم الأحيان ، يتم استخدامه عند إجراء عملية إضافة أو إعادة كتابة لتكييف التخطيط تلقائيًا لتضمين عمود جديد أو أكثر.

كيف يعمل تطور الدائرة؟


باتباع المثال من القسم السابق ، يمكن للمطورين بسهولة استخدام تطور المخطط لإضافة أعمدة جديدة تم رفضها سابقًا بسبب عدم تطابق المخطط. يتم تنشيط تطور المخطط عن طريق الإضافة .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 = TrueSpark إلى التكوين. ولكن استخدم هذا بحذر ، لأن فرض مخطط لن يحذرك بعد الآن من التناقضات غير المقصودة مع المخطط.

بتضمين معلمة في الاستعلام mergeSchema، تتم إضافة كافة الأعمدة الموجودة في DataFrame ولكنها ليست في الجدول الهدف تلقائيًا إلى نهاية المخطط كجزء من معاملة الكتابة. يمكن أيضًا إضافة الحقول المتداخلة ، وستتم إضافتها أيضًا إلى نهاية أعمدة الهيكل المقابلة.

يمكن لمهندسي التاريخ والعلماء استخدام هذا الخيار لإضافة أعمدة جديدة (ربما مقياس تم تتبعه مؤخرًا أو عمود مقاييس المبيعات هذا الشهر) إلى جداول إنتاج التعلم الآلي الحالية الخاصة بهم دون كسر النماذج الحالية بناءً على الأعمدة القديمة.

الأنواع التالية من تغييرات المخطط مقبولة كجزء من تطور المخطط عند إضافة جدول أو إعادة كتابته:

  • إضافة أعمدة جديدة (هذا هو السيناريو الأكثر شيوعًا)
  • تغيير أنواع البيانات من NullType -> أي نوع آخر أو رفعه من ByteType -> ShortType -> IntegerType

تتطلب التغييرات الأخرى غير المقبولة كجزء من تطور مخطط أن يتم استبدال المخطط والبيانات عن طريق الإضافة .option("overwriteSchema", "true"). على سبيل المثال ، في الحالة التي يكون فيها عمود "Foo" في الأصل عددًا صحيحًا ، ويكون المخطط الجديد عبارة عن نوع بيانات سلسلة ، فستحتاج جميع ملفات الباركيه (البيانات) إلى إعادة الكتابة. تتضمن هذه التغييرات:

  • حذف العمود
  • تغيير نوع بيانات عمود موجود (في المكان)
  • إعادة تسمية الأعمدة الحساسة فقط لحالة الأحرف (على سبيل المثال ، "Foo" و "foo")

أخيرًا ، مع الإصدار التالي من Spark 3.0 ، سيتم دعم DDL الصريح (باستخدام ALTER TABLE) بشكل كامل ، مما سيسمح للمستخدمين بتنفيذ الإجراءات التالية على مخططات الجدول:

  • إضافة أعمدة
  • تغيير تعليقات الأعمدة
  • تحديد خصائص الجدول التي تحدد سلوك الجدول ، على سبيل المثال ، تحديد مدة تخزين سجل المعاملات.

ما هو استخدام تطور الدائرة؟


يمكنك دائمًا استخدام تطور المخطط عندما تنوي تغيير مخطط الجدول الخاص بك (على عكس الحالات التي تضيف فيها أعمدة بطريق الخطأ إلى DataFrame التي يجب ألا تكون موجودة). هذه هي أسهل طريقة لترحيل مخططك لأنه يضيف تلقائيًا أسماء الأعمدة وأنواع البيانات الصحيحة دون الحاجة إلى الإعلان عنها صراحةً.

استنتاج


يؤدي فرض مخطط إلى رفض أي أعمدة جديدة أو تغييرات أخرى في المخطط لا تتوافق مع جدولك. من خلال وضع هذه المعايير العالية والمحافظة عليها ، يمكن للمحللين والمهندسين الاعتماد على حقيقة أن بياناتهم تتمتع بأعلى مستوى من النزاهة ، مع التفكير في ذلك بوضوح ووضوح ، مما يسمح لهم باتخاذ قرارات عمل أكثر فعالية.

من ناحية أخرى ، فإن تطور الدائرة يكمل الإنفاذ ، ويبسط التغييرات التلقائية المزعومة للدائرة. في النهاية ، لن يكون من الصعب إضافة عمود.

التطبيق القسري للدائرة هو يانغ ، حيث يكون تطور الدائرة يين. عند استخدامها معًا ، تجعل هذه الميزات تقليل الضوضاء وضبط الإشارات أسهل من أي وقت مضى.

نود أيضًا أن نشكر موكول مورتي وبرانافا أناندا على مساهماتهما في هذا المقال.

مقالات أخرى في السلسلة:

الغوص في بحيرة دلتا: تفريغ سجل المعاملات



مقالات ذات صلة


دلتا بحيرة مستوى إنتاج آلة التعلم

ما هو بحيرة البيانات؟



تعلم المزيد عن الدورة



All Articles