الكتابة فوق البيانات بشكل انتقائي باستخدام Delta Lake
يستفيد Azure Databricks من وظائف Delta Lake لدعم خيارين متميزين للكتابة فوق الانتقائية:
- يحل
replaceWhere
الخيار تلقائيا محل جميع السجلات التي تطابق دالة تقييم معينة. - يمكنك استبدال دلائل البيانات استنادا إلى كيفية تقسيم الجداول باستخدام الكتابة فوق القسم الديناميكي.
بالنسبة لمعظم العمليات، توصي Databricks باستخدام replaceWhere
لتحديد البيانات المراد الكتابة فوقها.
هام
إذا تمت الكتابة فوق البيانات عن طريق الخطأ، يمكنك استخدام الاستعادة للتراجع عن التغيير.
الكتابة فوق انتقائية عشوائية باستخدام replaceWhere
يمكنك الكتابة فوق البيانات التي تطابق تعبيرا عشوائيا بشكل انتقائي.
إشعار
يتطلب SQL Databricks Runtime 12.2 LTS أو أعلى.
يستبدل الأمر التالي الأحداث في يناير في الجدول الهدف، والذي يتم تقسيمه بواسطة start_date
، بالبيانات في replace_data
:
Python
(replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.table("events")
)
Scala
replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.table("events")
SQL
INSERT INTO TABLE events REPLACE WHERE start_date >= '2017-01-01' AND end_date <= '2017-01-31' SELECT * FROM replace_data
يقوم نموذج التعليمات البرمجية هذا بكتابة البيانات في replace_data
، ويتحقق من أن جميع الصفوف تطابق دالة التقييم، وينفذ استبدالا ذريا باستخدام overwrite
الدلالات. إذا كانت أي قيم في العملية تقع خارج القيد، تفشل هذه العملية مع حدوث خطأ بشكل افتراضي.
يمكنك تغيير هذا السلوك إلى overwrite
قيم ضمن نطاق التقييم والسجلات insert
التي تقع خارج النطاق المحدد. للقيام بذلك، قم بتعطيل التحقق من القيد عن طريق تعيين spark.databricks.delta.replaceWhere.constraintCheck.enabled
إلى خطأ باستخدام أحد الإعدادات التالية:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.constraintCheck.enabled=false
السلوك القديم
قام replaceWhere
السلوك الافتراضي القديم بالكتابة فوق بيانات مطابقة دالة تقييم على أعمدة القسم فقط. مع هذا النموذج القديم، سيستبدل الأمر التالي بشكل ذري شهر يناير في الجدول الهدف، والذي يتم تقسيمه بواسطة date
، بالبيانات في df
:
Python
(df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.table("people10m")
)
Scala
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.table("people10m")
إذا كنت تريد العودة إلى السلوك القديم، يمكنك تعطيل العلامة spark.databricks.delta.replaceWhere.dataColumns.enabled
:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.dataColumns.enabled=false
الكتابة فوق القسم الديناميكي
يدعم Databricks Runtime 11.3 LTS وما فوق وضع الكتابة فوق القسم الديناميكي للجداول المقسمة. بالنسبة للجداول ذات الأقسام المتعددة، يدعم Databricks Runtime 11.3 LTS والإصدارات أدناه فقط الكتابة فوق القسم الديناميكي إذا كانت جميع أعمدة الأقسام من نفس نوع البيانات.
عندما تكون في وضع الكتابة فوق القسم الديناميكي، تقوم العمليات بالكتابة فوق جميع البيانات الموجودة في كل قسم منطقي تقوم الكتابة بتثبيت بيانات جديدة له. تظل أي أقسام منطقية موجودة لا تحتوي الكتابة عليها على بيانات دون تغيير. ينطبق هذا الوضع فقط عند كتابة البيانات في وضع الكتابة فوق: إما INSERT OVERWRITE
في SQL، أو كتابة DataFrame باستخدام df.write.mode("overwrite")
.
تكوين وضع الكتابة فوق القسم الديناميكي عن طريق تعيين تكوين spark.sql.sources.partitionOverwriteMode
جلسة Spark إلى dynamic
. يمكنك أيضا تمكين ذلك عن طريق تعيين DataFrameWriter
الخيار partitionOverwriteMode
إلى dynamic
. إذا كان موجودا، فإن الخيار الخاص بالاستعلام يتجاوز الوضع المحدد في تكوين جلسة العمل. الافتراضي لـpartitionOverwriteMode
هو static
.
هام
تحقق من أن البيانات المكتوبة مع القسم الديناميكي تكتب فوق الأقسام المتوقعة فقط. يمكن أن يؤدي صف واحد في القسم غير الصحيح إلى الكتابة فوق قسم بأكمله عن غير قصد.
يوضح المثال التالي استخدام الكتابة فوق القسم الديناميكي:
SQL
SET spark.sql.sources.partitionOverwriteMode=dynamic;
INSERT OVERWRITE TABLE default.people10m SELECT * FROM morePeople;
Python
(df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
)
Scala
df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
إشعار
- تعارضات الكتابة فوق القسم الديناميكي مع خيار
replaceWhere
الجداول المقسمة.- إذا تم تمكين الكتابة فوق القسم الديناميكي في تكوين جلسة Spark، وتم
replaceWhere
توفيره كخيارDataFrameWriter
، فإن Delta Lake يحل محل البيانات وفقا للتعبيرreplaceWhere
(تتجاوز الخيارات الخاصة بالاستعلام تكوينات الجلسة). - تتلقى خطأ إذا كانت الخيارات تحتوي على
DataFrameWriter
كل من القسم الديناميكي بالكتابة فوقها وتمكينهاreplaceWhere
.
- إذا تم تمكين الكتابة فوق القسم الديناميكي في تكوين جلسة Spark، وتم
- لا يمكنك تحديد
overwriteSchema
عندtrue
استخدام الكتابة فوق القسم الديناميكي.