الأعمدة التي تم إنشاؤها بواسطة 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 هي نوع من الأعمدة التي تم إنشاؤها والتي تعين قيما فريدة لكل سجل مدرج في جدول. يوضح المثال التالي بناء الجملة الأساسي للإعلان عن عمود هوية أثناء إنشاء عبارة جدول:
SQL
CREATE TABLE table_name (
id_col1 BIGINT GENERATED ALWAYS AS IDENTITY,
id_col2 BIGINT GENERATED ALWAYS AS IDENTITY (START WITH -1 INCREMENT BY 1),
id_col3 BIGINT GENERATED BY DEFAULT AS IDENTITY,
id_col4 BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH -1 INCREMENT BY 1)
)
Python
from delta.tables import DeltaTable, IdentityGenerator
from pyspark.sql.types import LongType
DeltaTable.create()
.tableName("table_name")
.addColumn("id_col1", dataType=LongType(), generatedAlwaysAs=IdentityGenerator())
.addColumn("id_col2", dataType=LongType(), generatedAlwaysAs=IdentityGenerator(start=-1, step=1))
.addColumn("id_col3", dataType=LongType(), generatedByDefaultAs=IdentityGenerator())
.addColumn("id_col4", dataType=LongType(), generatedByDefaultAs=IdentityGenerator(start=-1, step=1))
.execute()
Scala
import io.delta.tables.DeltaTable
import org.apache.spark.sql.types.LongType
DeltaTable.create(spark)
.tableName("table_name")
.addColumn(
DeltaTable.columnBuilder(spark, "id_col1")
.dataType(LongType)
.generatedAlwaysAsIdentity().build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col2")
.dataType(LongType)
.generatedAlwaysAsIdentity(start = -1L, step = 1L).build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col3")
.dataType(LongType)
.generatedByDefaultAsIdentity().build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col4")
.dataType(LongType)
.generatedByDefaultAsIdentity(start = -1L, step = 1L).build())
.execute()
إشعار
تتوفر واجهات برمجة تطبيقات Scala وPython لأعمدة الهوية في Databricks Runtime 16.0 وما فوق.
للاطلاع على جميع خيارات بناء جملة SQL لإنشاء جداول باستخدام أعمدة الهوية، راجع إنشاء جدول [USING].
يمكنك اختياريا تحديد ما يلي:
- قيمة بداية.
- حجم الخطوة، والذي يمكن أن يكون موجبا أو سالبا.
كل من قيمة البداية وحجم الخطوة الافتراضي إلى 1
. لا يمكنك تحديد حجم خطوة ل 0
.
القيم التي تم تعيينها بواسطة أعمدة الهوية فريدة وتتزايد في اتجاه الخطوة المحددة، وفي مضاعفات حجم الخطوة المحددة، ولكنها غير مضمونة لتكون متقاربة. على سبيل المثال، مع قيمة بداية وحجم 0
2
خطوة ، تكون جميع القيم أرقاما زوجية موجبة ولكن قد يتم تخطي بعض الأرقام الزوجية.
عند استخدام عبارة GENERATED BY DEFAULT AS IDENTITY
، يمكن لعمليات الإدراج تحديد قيم لعمود الهوية. قم بتعديل العبارة لتكون GENERATED ALWAYS AS IDENTITY
لتجاوز القدرة على تعيين القيم يدويا.
تدعم BIGINT
أعمدة الهوية النوع فقط، وتفشل العمليات إذا تجاوزت القيمة المعينة النطاق الذي يدعمه BIGINT
.
للتعرف على مزامنة قيم عمود الهوية مع البيانات، راجع ALTER TABLE ... عبارة COLUMN.
CTAS وأعمدة الهوية
لا يمكنك تعريف المخطط أو قيود عمود الهوية أو أي مواصفات جدول أخرى عند استخدام عبارة CREATE TABLE table_name AS SELECT
(CTAS).
لإنشاء جدول جديد بعمود هوية وملئه بالبيانات الموجودة، قم بما يلي:
- إنشاء جدول بالمخطط الصحيح، بما في ذلك تعريف عمود الهوية وخصائص الجدول الأخرى.
INSERT
تشغيل عملية.
يستخدم DEFAULT
المثال التالي الكلمة الأساسية لتعريف عمود الهوية. إذا تضمنت البيانات المدرجة في الجدول قيما صالحة لعمود الهوية، يتم استخدام هذه القيم.
CREATE OR REPLACE TABLE new_table (
id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 5),
event_date DATE,
some_value BIGINT
);
-- Inserts records including existing IDs
INSERT INTO new_table
SELECT id, event_date, some_value FROM old_table;
-- Insert records and generate new IDs
INSERT INTO new_table
SELECT event_date, some_value FROM new_records;
قيود عمود الهوية
توجد القيود التالية عند العمل مع أعمدة الهوية:
- المعاملات المتزامنة غير معتمدة على الجداول مع تمكين أعمدة الهوية.
- لا يمكنك تقسيم جدول حسب عمود هوية.
- لا يمكنك استخدام
ALTER TABLE
عمودADD
REPLACE
هوية أو أوCHANGE
. - لا يمكنك تحديث قيمة عمود هوية لسجل موجود.
إشعار
لتغيير IDENTITY
قيمة سجل موجود، يجب حذف السجل وهو INSERT
كسجل جديد.