الأعمدة التي تم إنشاؤها بواسطة Delta Lake

هام

هذه الميزة في المعاينة العامة.

يدعم Delta Lake الأعمدة التي تم إنشاؤها وهي نوع خاص من الأعمدة التي يتم إنشاء قيمها تلقائيا استنادا إلى دالة محددة من قبل المستخدم عبر أعمدة أخرى في جدول Delta. عند الكتابة إلى جدول بأعمدة تم إنشاؤها وعدم توفير قيم لها بشكل صريح، يحسب Delta Lake القيم تلقائيا. على سبيل المثال، يمكنك إنشاء عمود تاريخ تلقائيا (لتقسيم الجدول حسب التاريخ) من عمود الطابع الزمني؛ تحتاج أي عمليات كتابة في الجدول إلى تحديد البيانات لعمود الطابع الزمني فقط. ومع ذلك، إذا قمت بتوفير قيم لها بشكل صريح، يجب أن تفي القيم بالقيد (<value> <=> <generation expression>) IS TRUE وإلا ستفشل الكتابة مع حدوث خطأ.

هام

تحتوي الجداول التي تم إنشاؤها باستخدام أعمدة تم إنشاؤها على إصدار بروتوكول كاتب جدول أعلى من الإصدار الافتراضي. راجع كيف تدير Azure Databricks توافق ميزة Delta Lake؟ لفهم إصدار بروتوكول الجدول وما يعنيه أن يكون لديك إصدار أعلى من إصدار بروتوكول الجدول.

إنشاء جدول بأعمدة تم إنشاؤها

يوضح المثال التالي كيفية إنشاء جدول بأعمدة تم إنشاؤها:

SQL

CREATE TABLE default.people10m (
  id INT,
  firstName STRING,
  middleName STRING,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  dateOfBirth DATE GENERATED ALWAYS AS (CAST(birthDate AS DATE)),
  ssn STRING,
  salary INT
)

Python

DeltaTable.create(spark) \
  .tableName("default.people10m") \
  .addColumn("id", "INT") \
  .addColumn("firstName", "STRING") \
  .addColumn("middleName", "STRING") \
  .addColumn("lastName", "STRING", comment = "surname") \
  .addColumn("gender", "STRING") \
  .addColumn("birthDate", "TIMESTAMP") \
  .addColumn("dateOfBirth", DateType(), generatedAlwaysAs="CAST(birthDate AS DATE)") \
  .addColumn("ssn", "STRING") \
  .addColumn("salary", "INT") \
  .execute()

Scala

DeltaTable.create(spark)
  .tableName("default.people10m")
  .addColumn("id", "INT")
  .addColumn("firstName", "STRING")
  .addColumn("middleName", "STRING")
  .addColumn(
    DeltaTable.columnBuilder("lastName")
      .dataType("STRING")
      .comment("surname")
      .build())
  .addColumn("lastName", "STRING", comment = "surname")
  .addColumn("gender", "STRING")
  .addColumn("birthDate", "TIMESTAMP")
  .addColumn(
    DeltaTable.columnBuilder("dateOfBirth")
     .dataType(DateType)
     .generatedAlwaysAs("CAST(dateOfBirth AS DATE)")
     .build())
  .addColumn("ssn", "STRING")
  .addColumn("salary", "INT")
  .execute()

يتم تخزين الأعمدة التي تم إنشاؤها كما لو كانت أعمدة عادية. أي أنهم يشغلون التخزين.

تنطبق القيود التالية على الأعمدة التي تم إنشاؤها:

  • يمكن لتعبير الجيل استخدام أي دالات SQL في Spark التي ترجع دائما نفس النتيجة عند إعطاء نفس قيم الوسيطة، باستثناء الأنواع التالية من الدالات:
    • الدالات المعرفة من قبل المستخدم.
    • الدالات التجميعية.
    • دوال النافذة.
    • الدالات التي ترجع صفوفا متعددة.

يمكن ل Delta Lake إنشاء عوامل تصفية أقسام لاستعلام كلما تم تعريف عمود قسم بواسطة أحد التعبيرات التالية:

إشعار

الفوتون مطلوب في Databricks Runtime 10.4 LTS وما دونه. الفوتون غير مطلوب في Databricks Runtime 11.3 LTS وما فوق.

  • CAST(col AS DATE) ونوع col هو TIMESTAMP.
  • YEAR(col) ونوع col هو TIMESTAMP.
  • عمودا قسم معرفان بواسطة YEAR(col), MONTH(col) ونوع col هو TIMESTAMP.
  • ثلاثة أعمدة أقسام معرفة بواسطة YEAR(col), MONTH(col), DAY(col) ونوع col هو TIMESTAMP.
  • أربعة أعمدة أقسام معرفة بواسطة YEAR(col), MONTH(col), DAY(col), HOUR(col) ونوع col هو TIMESTAMP.
  • SUBSTRING(col, pos, len) ونوع col هو STRING
  • DATE_FORMAT(col, format) ونوع col هو TIMESTAMP.
    • يمكنك فقط استخدام تنسيقات التاريخ مع الأنماط التالية: yyyy-MM و yyyy-MM-dd-HH.
    • في Databricks Runtime 10.4 LTS وما فوق، يمكنك أيضا استخدام النمط التالي: yyyy-MM-dd.

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

CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
eventDate date GENERATED ALWAYS AS (CAST(eventTime AS DATE))
)
PARTITIONED BY (eventType, eventDate)

إذا قمت بتشغيل الاستعلام التالي:

SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"

يقوم Delta Lake تلقائيا بإنشاء عامل تصفية قسم بحيث يقرأ الاستعلام السابق البيانات الموجودة في القسم date=2020-10-01 فقط حتى إذا لم يتم تحديد عامل تصفية القسم.

كمثال آخر، بالنظر إلى الجدول التالي:

CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
year INT GENERATED ALWAYS AS (YEAR(eventTime)),
month INT GENERATED ALWAYS AS (MONTH(eventTime)),
day INT GENERATED ALWAYS AS (DAY(eventTime))
)
PARTITIONED BY (eventType, year, month, day)

إذا قمت بتشغيل الاستعلام التالي:

SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"

يقوم Delta Lake تلقائيا بإنشاء عامل تصفية قسم بحيث يقرأ الاستعلام السابق البيانات الموجودة في القسم year=2020/month=10/day=01 فقط حتى إذا لم يتم تحديد عامل تصفية القسم.

يمكنك استخدام عبارة EXPLAIN والتحقق من الخطة المقدمة لمعرفة ما إذا كان Delta Lake ينشئ تلقائيا أي عوامل تصفية أقسام.

استخدام أعمدة الهوية في Delta Lake

هام

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

أعمدة هوية Delta Lake هي نوع من الأعمدة التي تم إنشاؤها والتي تعين قيما فريدة لكل سجل مدرج في جدول. يوضح المثال التالي بناء الجملة الأساسي للإعلان عن عمود هوية أثناء إنشاء عبارة جدول:

CREATE TABLE table_name (
  identity_col BIGINT GENERATED BY DEFAULT AS IDENTITY,
  other_column ...)

للاطلاع على كافة خيارات بناء الجملة لإنشاء جداول باستخدام أعمدة الهوية، راجع إنشاء جدول [USING].

يمكنك اختياريا تحديد ما يلي:

  • قيمة بداية.
  • حجم الخطوة، والذي يمكن أن يكون موجبا أو سالبا.

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

عند استخدام عبارة GENERATED BY DEFAULT AS IDENTITY، يمكن لعمليات الإدراج تحديد قيم لعمود الهوية. قم بتعديل العبارة لتكون GENERATED ALWAYS AS IDENTITY لتجاوز القدرة على تعيين القيم يدويا.

تدعم BIGINT أعمدة الهوية النوع فقط، وتفشل العمليات إذا تجاوزت القيمة المعينة النطاق الذي يدعمه BIGINT.

للتعرف على مزامنة قيم عمود الهوية مع البيانات، راجع ALTER TABLE.

قيود عمود الهوية

توجد القيود التالية عند العمل مع أعمدة الهوية:

  • المعاملات المتزامنة غير معتمدة على الجداول مع تمكين أعمدة الهوية.
  • لا يمكنك تقسيم جدول حسب عمود هوية.
  • لا يمكنك استخدام ALTER TABLE عمود ADDREPLACEهوية أو أو CHANGE .
  • لا يمكنك تحديث قيمة عمود هوية لسجل موجود.

إشعار

لتغيير IDENTITY قيمة سجل موجود، يجب حذف السجل وهو INSERT كسجل جديد.