استيعاب البيانات باستخدام طرق SQL

مكتمل

توفر أوامر SQL نهجا إعلانيا لاستيعاب البيانات في Azure Databricks. إذا كنت مرتاحا بالفعل مع بناء جملة SQL، هذه الطرق تتيح لك إنشاء وملء الجداول دون الحاجة لكتابة كود إجرائي. تقنيات الإدخال الثلاث الأساسية ل SQL—CREATE TABLE AS SELECT (CTAS), CREATE OR REPLACE TABLE, و COPY INTO—تعالج كل منها سيناريوهات إدخال مختلفة مع الحفاظ على التوافق الكامل مع كتالوج Unity.

إنشاء جداول من الاستعلامات باستخدام CTAS

تجمع العبارة CREATE TABLE AS SELECT بين إنشاء الجداول وجمع البيانات في عملية واحدة. تحدد جدولا جديدا بناء على نتائج الاستعلام SELECT ، مما يجعله مثاليا لتحويل البيانات أثناء الاستيعاب.

تخيل سيناريو تحتاج فيه إلى استيعاب بيانات العملاء من مصدر خارجي وتطبيق التحويلات. مع CTAS، تكتب استعلاما يقرأ من المصدر، ويطبق تحويلاتك، ويحفظ النتائج على جدول مدار جديد:

CREATE TABLE catalog.schema.customers AS
SELECT 
    customer_id,
    UPPER(customer_name) AS customer_name,
    email,
    created_date
FROM external_staging.raw_customers
WHERE customer_status = 'active';

يتم اشتقاق مخطط الجدول تلقائيا من نتائج الاستعلام. يقوم Azure Databricks بإنشاء الجدول باستخدام صيغة Delta بشكل افتراضي، والتي توفر معاملات ACID، والسفر عبر الزمن، وأداء محسنا.

يعمل CTAS بشكل جيد لتحميل البيانات الأولي والترحيلات لمرة واحدة. عندما تحتاج إلى قراءة البيانات من الملفات، قم بدمج CTAS مع read_files دالة الجدول القيمي:

CREATE TABLE catalog.schema.sales_data AS
SELECT * FROM read_files(
    '/Volumes/catalog/schema/volume/sales/*.parquet',
    format => 'parquet'
);

Note

تنشئ CTAS جدولا جديدا في كل مرة يعمل. إذا كان الجدول موجودا بالفعل، يفشل الأمر إلا إذا استخدمت الجملة IF NOT EXISTS — لكن تلك الجملة تتجاوز التنفيذ تماما بدلا من تحديث الجدول.

تحديث الجداول باستخدام إنشاء أو استبدال الجدول

عندما تحتاج إلى تحديث محتويات الجدول بالكامل، CREATE OR REPLACE TABLE يوفر حلا نظيفا. هذا الأمر إما ينشئ جدولا جديدا أو يستبدل جدولا موجودا بالكامل، محافظا على سجل الجدول، والامتيازات الممنوحة، وأي فلاتر صفوف أو أقنعة أعمدة قمت بتكوينها.

يثبت هذا النهج قيمته في تحديثات البيانات الدورية التي ترغب في استبدال جميع البيانات الموجودة:

CREATE OR REPLACE TABLE catalog.schema.daily_metrics AS
SELECT 
    report_date,
    SUM(revenue) AS total_revenue,
    COUNT(DISTINCT customer_id) AS unique_customers
FROM catalog.schema.transactions
WHERE report_date >= CURRENT_DATE - INTERVAL 30 DAYS
GROUP BY report_date;

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

يمكنك أيضا استخدام هذا الأمر لتحميل البيانات مباشرة من الملفات. يتم استنتاج المخطط تلقائيا من نتائج الاستعلام:

CREATE OR REPLACE TABLE catalog.schema.products AS
SELECT * FROM read_files(
    '/Volumes/catalog/schema/volume/products.csv',
    format => 'csv',
    header => true
);

مهم

CREATE OR REPLACE يقوم باستبدال كامل للطاولة. للتحديثات التدريجية التي تريد فقط إضافة سجلات جديدة، استخدم COPY INTO بدلا من ذلك.

تحميل الملفات تدريجيا باستخدام COPY INTO

COPY INTO يعالج تحديا شائعا في الاستهلاك: تحميل الملفات من التخزين السحابي بطريقة موثوقة وقابلة للتكرار. على عكس CTAS، الذي يعمل مرة واحدة وينشئ جدولا، COPY INTO مصمم لسير عمل الإدخال المستمر حيث تصل ملفات جديدة بانتظام.

يقرأ الأمر الملفات من موقع محدد ويرفقها على جدول دلتا موجود. ميزته الأساسية هي الهوية—حيث يتم تخطي الملفات التي تم تحميلها بالفعل تلقائيا، حتى عبر عدة عمليات تنفيذ:

COPY INTO catalog.schema.events
FROM '/Volumes/catalog/schema/volume/events/'
FILEFORMAT = JSON
FORMAT_OPTIONS ('multiline' = 'true');

قبل التشغيل COPY INTO، يجب أن يكون جدول الهدف موجودا بالفعل. أنشئها باستخدام المخطط المناسب:

CREATE TABLE IF NOT EXISTS catalog.schema.events (
    event_id STRING,
    event_type STRING,
    event_timestamp TIMESTAMP,
    payload STRING
);

تكوين اختيار الملف

عندما يحتوي دليل المصدر الخاص بك على ملفات بأنماط تسمية مختلفة أو تحتاج إلى تحميل ملفات محددة، استخدم خيارات PATTERN OR FILES :

-- Load only files matching a pattern
COPY INTO catalog.schema.orders
FROM '/Volumes/catalog/schema/volume/orders/'
FILEFORMAT = PARQUET
PATTERN = 'orders_2024*.parquet';

-- Load specific files by name
COPY INTO catalog.schema.orders
FROM '/Volumes/catalog/schema/volume/orders/'
FILEFORMAT = PARQUET
FILES = ('orders_001.parquet', 'orders_002.parquet');

التعامل مع المخطط وجودة البيانات

COPY INTO يوفر خيارات للتعامل مع تغييرات المخطط والتحقق من صحة البيانات قبل التحميل:

COPY INTO catalog.schema.sensor_data
FROM '/Volumes/catalog/schema/volume/sensors/'
FILEFORMAT = CSV
FORMAT_OPTIONS (
    'header' = 'true',
    'inferSchema' = 'true'
)
COPY_OPTIONS ('mergeSchema' = 'true');

يسمح هذا mergeSchema الخيار بتطور مخطط الجدول مع ظهور أعمدة جديدة في ملفات المصدر. للتحقق من صحة البيانات دون تحميلها، أضف جملة VALIDATE:

COPY INTO catalog.schema.sensor_data
FROM '/Volumes/catalog/schema/volume/sensors/'
FILEFORMAT = CSV
VALIDATE ALL;

هذا التحقق يتحقق مما إذا كان يمكن تحليل البيانات، ويتطابق مخطط الجدول، ويحقق قيود العدم والتحقق.

اختر الطريقة الصحيحة

كل طريقة إدخال SQL تخدم أغراضا مختلفة في سير عمل هندسة البيانات الخاص بك:

Method الأفضل ل Behavior
CTAS تحميل البيانات الأولي، الترحيلات لمرة واحدة، إنشاء جداول من الاستعلامات ينشئ طاولة جديدة؛ يفشل إذا كان هناك جدول
إنشاء أو استبدال تحديثات كاملة دورية، واستبدال جداول الترتيب تحل محل الطاولة بأكملها؛ يحافظ على الأذونات
انسخ إلى استيعاب الملفات المستمر، والأحمال التدريجية ترفق على الجدول الحالي؛ تخطي الملفات المحملة

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

Note

COPY INTO يعمل بشكل جيد عند استيعاب الملفات بالآلاف مع مرور الوقت. بالنسبة للمصادر التي ستنمو لتصل إلى ملايين الملفات أو أكثر، فإن Auto Loader (سيتم تناوله في الوحدة التالية) هو النهج الموصى به—فهو يكتشف الملفات بكفاءة أكبر، ويدعم تطوير المخططات بشكل أغنى، ويتوسع دون عبء إدراج الدليل. توصي Databricks أيضا بجداول البث المدعومة ب Auto Loader كبديل قابل للتوسع وطويل الأمد لإدخال الملفات المعتمد على SQL.