تكوين استنتاج المخطط وتطوره في Auto Loader

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

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

يتم دعم التنسيقات التالية لاستدلال المخطط وتطوره:

تنسيق الملف الإصدارات المدعومة
JSON جميع الإصدارات
CSV جميع الإصدارات
XML Databricks Runtime 14.3 LTS وما فوق
Avro Databricks Runtime 10.4 LTS وما فوق
Parquet Databricks Runtime 11.3 LTS وما فوق
ORC غير مدعوم
Text غير قابل للتطبيق (مخطط ثابت)
Binaryfile غير قابل للتطبيق (مخطط ثابت)

بناء الجملة لاستدلال المخطط وتطوره

يتيح تحديد دليل هدف للخيار cloudFiles.schemaLocation استنتاج المخطط وتطوره. يمكنك اختيار استخدام نفس الدليل الذي تحدده ل checkpointLocation. إذا كنت تستخدم Delta Live Tables، فإن Azure Databricks يدير موقع المخطط ومعلومات نقطة التحقق الأخرى تلقائيا.

إشعار

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

يستخدم parquet المثال التالي ل cloudFiles.format. استخدم csvأو avroأو json لمصادر ملفات أخرى. تبقى جميع الإعدادات الأخرى للقراءة والكتابة كما هي بالنسبة للسلوكيات الافتراضية لكل تنسيق.

Python

(spark.readStream.format("cloudFiles")
  .option("cloudFiles.format", "parquet")
  # The schema location directory keeps track of your data schema over time
  .option("cloudFiles.schemaLocation", "<path-to-checkpoint>")
  .load("<path-to-source-data>")
  .writeStream
  .option("checkpointLocation", "<path-to-checkpoint>")
  .start("<path_to_target")
)

Scala

spark.readStream.format("cloudFiles")
  .option("cloudFiles.format", "parquet")
  // The schema location directory keeps track of your data schema over time
  .option("cloudFiles.schemaLocation", "<path-to-checkpoint>")
  .load("<path-to-source-data>")
  .writeStream
  .option("checkpointLocation", "<path-to-checkpoint>")
  .start("<path_to_target")

كيف يعمل استدلال مخطط التحميل التلقائي؟

للاستدلال على المخطط عند قراءة البيانات لأول مرة، يقوم "المحمل التلقائي" بأخذ عينات من أول 50 غيغابايت أو 1000 ملف يكتشفها، أيهما يتم تجاوزه أولا. يخزن Loader التلقائي معلومات المخطط في دليل _schemas تم تكوينه cloudFiles.schemaLocation لتعقب تغييرات المخطط على بيانات الإدخال بمرور الوقت.

إشعار

لتغيير حجم العينة المستخدمة، يمكنك تعيين تكوينات SQL:

spark.databricks.cloudFiles.schemaInference.sampleSize.numBytes

(سلسلة البايت، على سبيل المثال 10gb)

و

spark.databricks.cloudFiles.schemaInference.sampleSize.numFiles

(عدد صحيح)

بشكل افتراضي، يسعى استنتاج مخطط التحميل التلقائي إلى تجنب مشكلات تطور المخطط بسبب عدم تطابق النوع. بالنسبة إلى التنسيقات التي لا تقوم بترميز أنواع البيانات (JSON وCSV وXML)، يستنتج المحمل التلقائي جميع الأعمدة كسلاسل (بما في ذلك الحقول المتداخلة في ملفات JSON). بالنسبة للتنسيقات ذات المخطط المطبعي (Parquet وAvro)، يقوم برنامج التحميل التلقائي بأخذ عينات من مجموعة فرعية من الملفات ودمج مخططات الملفات الفردية. يتم تلخيص هذا السلوك في الجدول التالي:

تنسيق الملف نوع البيانات المستنتجة الافتراضية
JSON السلسلة‬
CSV السلسلة‬
XML السلسلة‬
Avro الأنواع المشفرة في مخطط Avro
Parquet الأنواع المشفرة في مخطط Parquet

يستخدم Apache Spark DataFrameReader سلوكا مختلفا لاستدلال المخطط، وتحديد أنواع البيانات للأعمدة في مصادر JSON وCSV وXML استنادا إلى بيانات العينة. لتمكين هذا السلوك باستخدام "المحمل التلقائي"، قم بتعيين الخيار cloudFiles.inferColumnTypes إلى true.

إشعار

عند استنتاج مخطط بيانات CSV، يفترض "المحمل التلقائي" أن الملفات تحتوي على رؤوس. إذا كانت ملفات CSV لا تحتوي على رؤوس، فقم بتوفير الخيار .option("header", "false"). بالإضافة إلى ذلك، يدمج "المحمل التلقائي" مخططات جميع الملفات في العينة للتوصل إلى مخطط عمومي. يمكن للتحميل التلقائي بعد ذلك قراءة كل ملف وفقا لعنوانه وتحليل CSV بشكل صحيح.

إشعار

عندما يحتوي العمود على أنواع بيانات مختلفة في ملفي Parquet، يختار "المحمل التلقائي" النوع الأوسع. يمكنك استخدام schemaHints لتجاوز هذا الاختيار. عند تحديد تلميحات المخطط، لا يقوم "التحميل التلقائي" بتحريك العمود إلى النوع المحدد، ولكنه يخبر قارئ Parquet بقراءة العمود كنوع محدد. في حالة عدم التطابق، يتم إنقاذ العمود في عمود البيانات الذي تم إنقاذه.

كيف يعمل تطور مخطط التحميل التلقائي؟

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

توصي Databricks بتكوين تدفقات التحميل التلقائي مع مهام سير العمل لإعادة التشغيل تلقائيا بعد تغييرات المخطط هذه.

يدعم Auto Loader الأوضاع التالية لتطور المخطط، والتي قمت بتعيينها في الخيار cloudFiles.schemaEvolutionMode:

وضع سلوك قراءة عمود جديد
addNewColumns (افتراضي) فشل الدفق. تتم إضافة أعمدة جديدة إلى المخطط. لا تطور الأعمدة الموجودة أنواع البيانات.
rescue لا يتطور المخطط أبدا ولا يفشل الدفق بسبب تغييرات المخطط. يتم تسجيل جميع الأعمدة الجديدة في عمود البيانات الذي تم إنقاذه.
failOnNewColumns فشل الدفق. لا تتم إعادة تشغيل الدفق ما لم يتم تحديث المخطط المقدم، أو تتم إزالة ملف البيانات المخالف.
none لا تطور المخطط، ويتم تجاهل الأعمدة الجديدة، ولا يتم إنقاذ البيانات ما لم rescuedDataColumn يتم تعيين الخيار. لا يفشل الدفق بسبب تغييرات المخطط.

كيف تعمل الأقسام مع أداة التحميل التلقائي؟

يحاول المحمل التلقائي استنتاج أعمدة التقسيم من بنية الدليل الأساسية للبيانات إذا تم تخطيط البيانات في تقسيم نمط Hive. على سبيل المثال، ينتج عن مسار base_path/event=click/date=2021-04-01/f0.json الملف استنتاج date و event كأعمدة قسم. إذا كانت بنية الدليل الأساسية تحتوي على أقسام Hive متعارضة أو لا تحتوي على تقسيم نمط Hive، يتم تجاهل أعمدة الأقسام.

تحتوي تنسيقات الملفات الثنائية (binaryFile) وتنسيقات text الملفات على مخططات بيانات ثابتة، ولكنها تدعم استنتاج عمود القسم. توصي Databricks بإعداد cloudFiles.schemaLocation تنسيقات الملفات هذه. هذا يتجنب أي أخطاء محتملة أو فقدان المعلومات ويمنع استنتاج أعمدة الأقسام في كل مرة يبدأ فيها التحميل التلقائي.

لا يتم اعتبار أعمدة التقسيم لتطور المخطط. إذا كان لديك بنية دليل أولية مثل base_path/event=click/date=2021-04-01/f0.json، ثم ابدأ في تلقي ملفات جديدة ك base_path/event=click/date=2021-04-01/hour=01/f1.json، يتجاهل "المحمل التلقائي" عمود الساعة. لالتقاط معلومات لأعمدة الأقسام الجديدة، قم بتعيين cloudFiles.partitionColumns إلى event,date,hour.

إشعار

يأخذ الخيار cloudFiles.partitionColumns قائمة أسماء الأعمدة مفصولة بفواصل. يتم تحليل الأعمدة الموجودة كأزواج key=value في بنية الدليل فقط.

ما هو عمود البيانات الذي تم إنقاذه؟

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

يضمن عمود البيانات الذي تم إنقاذه إنقاذ الأعمدة التي لا تتطابق مع المخطط بدلا من إسقاطها. يحتوي عمود البيانات الذي تم إنقاذه على أي بيانات لم يتم تحليلها للأسباب التالية:

  • العمود مفقود من المخطط.
  • عدم تطابق النوع.
  • عدم تطابق الحالة.

يحتوي عمود البيانات الذي تم إنقاذه على JSON يحتوي على الأعمدة التي تم إنقاذها ومسار الملف المصدر للسجل.

إشعار

يدعم محللو JSON وCSV ثلاثة أوضاع عند تحليل السجلات: PERMISSIVEو DROPMALFORMEDو FAILFAST. عند استخدامها مع rescuedDataColumn، لا تتسبب عدم تطابقات نوع البيانات في إسقاط السجلات في DROPMALFORMED الوضع أو طرح خطأ في FAILFAST الوضع. يتم إسقاط السجلات التالفة فقط أو طرح الأخطاء، مثل JSON أو CSV غير مكتمل أو مشوه. إذا كنت تستخدم badRecordsPath عند تحليل JSON أو CSV، فلن يتم اعتبار عدم تطابق نوع البيانات كسجلات سيئة عند استخدام rescuedDataColumn. يتم تخزين سجلات JSON أو CSV غير المكتملة والمضللة فقط في badRecordsPath.

تغيير السلوك الحساس لحالة الأحرف

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

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

تجاوز استنتاج المخطط بتلميحات المخطط

يمكنك استخدام تلميحات المخطط لفرض معلومات المخطط التي تعرفها وتتوقعها على مخطط مستنتج. عندما تعرف أن العمود من نوع بيانات معين، أو إذا كنت تريد اختيار نوع بيانات أكثر عمومية (على سبيل المثال، double بدلا من integer)، يمكنك توفير عدد عشوائي من التلميحات لأنواع بيانات الأعمدة كسلسلة باستخدام بناء جملة مواصفات مخطط SQL، مثل ما يلي:

.option("cloudFiles.schemaHints", "tags map<string,string>, version int")

راجع الوثائق حول أنواع البيانات لقائمة أنواع البيانات المدعومة.

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

فيما يلي مثال على مخطط مستنتج لمشاهدة السلوك مع تلميحات المخطط.

المخطط المستنتج:

|-- date: string
|-- quantity: int
|-- user_info: struct
|    |-- id: string
|    |-- name: string
|    |-- dob: string
|-- purchase_options: struct
|    |-- delivery_address: string

بتحديد تلميحات المخطط التالية:

.option("cloudFiles.schemaHints", "date DATE, user_info.dob DATE, purchase_options MAP<STRING,STRING>, time TIMESTAMP")

يمكنك الحصول على:

|-- date: string -> date
|-- quantity: int
|-- user_info: struct
|    |-- id: string
|    |-- name: string
|    |-- dob: string -> date
|-- purchase_options: struct -> map<string,string>
|-- time: timestamp

إشعار

يتوفر دعم تلميحات مخطط الصفيف والخريطة في Databricks Runtime 9.1 LTS وما فوق.

فيما يلي مثال على مخطط مستنتج مع أنواع بيانات معقدة لمشاهدة السلوك مع تلميحات المخطط.

المخطط المستنتج:

|-- products: array<string>
|-- locations: array<string>
|-- users: array<struct>
|    |-- users.element: struct
|    |    |-- id: string
|    |    |-- name: string
|    |    |-- dob: string
|-- ids: map<string,string>
|-- names: map<string,string>
|-- prices: map<string,string>
|-- discounts: map<struct,string>
|    |-- discounts.key: struct
|    |    |-- id: string
|    |-- discounts.value: string
|-- descriptions: map<string,struct>
|    |-- descriptions.key: string
|    |-- descriptions.value: struct
|    |    |-- content: int

بتحديد تلميحات المخطط التالية:

.option("cloudFiles.schemaHints", "products ARRAY<INT>, locations.element STRING, users.element.id INT, ids MAP<STRING,INT>, names.key INT, prices.value INT, discounts.key.id INT, descriptions.value.content STRING")

يمكنك الحصول على:

|-- products: array<string> -> array<int>
|-- locations: array<int> -> array<string>
|-- users: array<struct>
|    |-- users.element: struct
|    |    |-- id: string -> int
|    |    |-- name: string
|    |    |-- dob: string
|-- ids: map<string,string> -> map<string,int>
|-- names: map<string,string> -> map<int,string>
|-- prices: map<string,string> -> map<string,int>
|-- discounts: map<struct,string>
|    |-- discounts.key: struct
|    |    |-- id: string -> int
|    |-- discounts.value: string
|-- descriptions: map<string,struct>
|    |-- descriptions.key: string
|    |-- descriptions.value: struct
|    |    |-- content: int -> string

إشعار

يتم استخدام تلميحات المخطط فقط إذا لم توفر مخططا إلى "المحمل التلقائي". يمكنك استخدام تلميحات المخطط سواء تم cloudFiles.inferColumnTypes تمكينه أو تعطيله.