الكتابة فوق البيانات بشكل انتقائي باستخدام 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'")
  .save("/tmp/delta/events")
)

Scala

replace_data.write
  .mode("overwrite")
  .option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
  .save("/tmp/delta/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'")
  .save("/tmp/delta/people10m")
)

Scala

df.write
  .mode("overwrite")
  .option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
  .save("/tmp/delta/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 .
  • لا يمكنك تحديد overwriteSchema عند true استخدام الكتابة فوق القسم الديناميكي.