جودة البيانات الآلية باستخدام Dataplex والذكاء الاصطناعي التوليدي

1. مقدمة

يقدّم هذا الدرس التطبيقي حول الترميز مخططًا فنيًا للمتخصّصين في مجال البيانات. ويوضّح هذا المستند نهج "التركيز على الترميز" في إدارة البيانات، ويوضّح كيفية تضمين إدارة عالية الجودة للبيانات وبيانات التعريف مباشرةً في مراحل التطوير. في جوهره، يعمل "الفهرس الشامل" في Dataplex كنسيج بيانات ذكي، ما يتيح للمؤسسات إدارة البيانات ومراقبتها والتحكّم فيها بشكل مركزي في جميع أنظمتها، بدءًا من مستودعات البيانات العادية إلى مستودعات البيانات.

يوضّح هذا الدرس العملي كيفية الاستفادة من Dataplex وBigQuery وواجهة سطر الأوامر في Gemini لتسوية البيانات المعقّدة، وتحديد خصائصها آليًا، وإنشاء اقتراحات ذكية لقواعد جودة البيانات، ونشر عمليات فحص الجودة المبرمَجة. الهدف الأساسي هو تجاوز العمليات اليدوية المستندة إلى واجهة المستخدم، والتي تكون عرضة للأخطاء ويصعب توسيع نطاقها، وإنشاء إطار عمل قوي يمكن التحكّم في إصداراته باسم "السياسة كرمز".

المتطلبات الأساسية

  • فهم أساسي لـ Google Cloud Console
  • مهارات أساسية في واجهة سطر الأوامر وGoogle Cloud Shell

ما ستتعلمه

  • كيفية تسوية بيانات BigQuery المتداخلة باستخدام "طرق العرض المادية" لتفعيل إنشاء ملفات تعريف شاملة
  • كيفية تشغيل عمليات فحص الملفات الشخصية وإدارتها آليًا في Dataplex باستخدام مكتبة برامج Dataplex Python.
  • كيفية تصدير بيانات الملف الشخصي وتنظيمها كمدخل لنموذج الذكاء الاصطناعي التوليدي
  • كيفية تصميم طلب لواجهة سطر الأوامر في Gemini من أجل تحليل بيانات الملف الشخصي وإنشاء ملف قواعد YAML متوافق مع Dataplex
  • أهمية عملية تفاعلية تتضمّن مشاركة بشرية (HITL) للتحقّق من صحة الإعدادات التي ينشئها الذكاء الاصطناعي
  • كيفية نشر القواعد التي تم إنشاؤها كعملية مسح مبرمَجة لجودة البيانات

المتطلبات

  • حساب Google Cloud ومشروع Google Cloud
  • متصفّح ويب، مثل Chrome

المفاهيم الأساسية: أسس جودة البيانات في Dataplex

يُعدّ فهم المكوّنات الأساسية في Dataplex أمرًا ضروريًا لوضع استراتيجية فعّالة لجودة البيانات.

  • فحص ملف بيانات: مهمة Dataplex تحلّل البيانات وتنشئ بيانات وصفية إحصائية، بما في ذلك النسب المئوية للقيم الفارغة وعدد القيم المميزة وتوزيعات القيم. وهذا بمثابة مرحلة "الاكتشاف" الآلية.
  • قواعد جودة البيانات: عبارات توضيحية تحدّد الشروط التي يجب أن تستوفيها بياناتك (مثلاً، NonNullExpectation، SetExpectation، RangeExpectation).
  • الذكاء الاصطناعي التوليدي لاقتراح القواعد: استخدام نموذج لغوي كبير (مثل Gemini) لتحليل ملف بيانات واقتراح قواعد جودة البيانات ذات الصلة. يؤدي ذلك إلى تسريع عملية تحديد إطار عمل أساسي للجودة.
  • فحص جودة البيانات: مهمة في Dataplex تتحقّق من صحة البيانات استنادًا إلى مجموعة من القواعد المحدّدة مسبقًا أو المخصّصة.
  • إدارة الحوكمة آليًا: هي الموضوع الرئيسي لإدارة عناصر التحكّم في الحوكمة (مثل قواعد الجودة) كرموز برمجية (على سبيل المثال، في ملفات YAML ونصوص Python البرمجية). يتيح ذلك إمكانية التشغيل الآلي وإدارة الإصدارات والدمج في مسارات CI/CD.
  • المشاركة البشرية (HITL): هي نقطة التحكّم المهمة لدمج الخبرة والإشراف البشريَّين في سير عمل آلي. بالنسبة إلى الإعدادات التي ينشئها الذكاء الاصطناعي، من الضروري أن يتدخّل الإنسان في عملية التحقّق من صحة الاقتراحات ومدى صلتها بالنشاط التجاري وسلامتها قبل نشرها.

2. الإعداد والمتطلبات

بدء Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

55efc1aaa7a4d3ad.png

لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

7ffe5cbb04455448.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا ثابتًا بسعة 5 غيغابايت، وتعمل على Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا الدرس العملي ضمن المتصفّح. ليس عليك تثبيت أي تطبيق.

تفعيل واجهات برمجة التطبيقات المطلوبة وإعداد البيئة

داخل Cloud Shell، تأكَّد من إعداد رقم تعريف مشروعك:

export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project $PROJECT_ID
export LOCATION="us-central1"
export BQ_LOCATION="us"
export DATASET_ID="dataplex_dq_codelab"
export TABLE_ID="ga4_transactions"

gcloud services enable dataplex.googleapis.com \
                       bigquery.googleapis.com \
                       serviceusage.googleapis.com

في المثال، نستخدم us (متعدد المناطق) كموقع جغرافي لأنّ بيانات العيّنة العامة التي سنستخدمها تقع أيضًا في us (متعدد المناطق). يشترط BigQuery أن تكون البيانات المصدر وجدول الوجهة لأي طلب بحث في الموقع الجغرافي نفسه.

إنشاء مجموعة بيانات مخصّصة في BigQuery

أنشئ مجموعة بيانات جديدة في BigQuery لتضمين البيانات النموذجية والنتائج.

bq --location=us mk --dataset $PROJECT_ID:$DATASET_ID

إعداد بيانات النموذج

في هذا الدرس العملي، ستستخدم مجموعة بيانات عامة تحتوي على بيانات تجارة إلكترونية تم إخفاء مفاتيح فك تشفيرها من "متجر بيع سلع Google". بما أنّ مجموعات البيانات العامة تكون للقراءة فقط، عليك إنشاء نسخة قابلة للتعديل في مجموعة البيانات الخاصة بك. ينشئ أمر bq التالي جدولاً جديدًا، ga4_transactions، في مجموعة البيانات dataplex_dq_codelab. تنسخ هذه السمة البيانات من يوم واحد (2021-01-31) لضمان إجراء عمليات الفحص بسرعة.

bq query \
--use_legacy_sql=false \
--destination_table=$PROJECT_ID:$DATASET_ID.$TABLE_ID \
--replace=true \
'SELECT * FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_20210131`'

إعداد دليل العرض التوضيحي

للبدء، عليك استنساخ مستودع GitHub يحتوي على بنية المجلدات والملفات اللازمة لهذا الدرس البرمجي.

git clone https://github.com/GoogleCloudPlatform/devrel-demos
cd devrel-demos/data-analytics/programmatic-dq

أصبح هذا الدليل الآن مساحة العمل النشطة. سيتم إنشاء جميع الملفات اللاحقة هنا.

3- اكتشاف البيانات آليًا باستخدام ميزة إنشاء الملفات الشخصية في Dataplex

تُعدّ ميزة "إعداد ملفات بيانات" في Dataplex أداة فعّالة لاكتشاف المعلومات الإحصائية حول بياناتك تلقائيًا، مثل النسب المئوية للقيم الفارغة، والتفرّد، وتوزيع القيم. هذه العملية ضرورية لفهم بنية بياناتك وجودتها. ومع ذلك، فإنّ إحدى القيود المعروفة لإنشاء الملفات الشخصية في Dataplex هي عدم القدرة على فحص الحقول المتداخلة أو المتكررة بشكل كامل (على سبيل المثال، أنواع RECORD أو ARRAY) ضمن جدول يمكنه تحديد أنّ العمود من النوع المعقّد، ولكن لا يمكنه إنشاء ملف شخصي للحقول الفردية داخل هذه البنية المتداخلة.

للتغلّب على ذلك، سنحوّل البيانات إلى طرق عرض مجسَّمة مصمَّمة خصيصًا. تتيح هذه الاستراتيجية أن يصبح كل حقل عمودًا ذا مستوى أعلى، ما يتيح لخدمة Dataplex إنشاء ملف تعريف لكل حقل على حدة.

التعرّف على المخطط المتداخل

أولاً، لنفحص مخطط جدول المصدر. تحتوي مجموعة بيانات "إحصاءات Google‏ 4" على العديد من الأعمدة المتداخلة والمتكرّرة. لاسترداد المخطط الكامل آليًا، بما في ذلك جميع البُنى المتداخلة، يمكنك استخدام الأمر bq show وحفظ الناتج كملف JSON.

bq show --schema --format=json $PROJECT_ID:$DATASET_ID.$TABLE_ID > bq_schema.json

يكشف فحص الملف bq_schema.json عن بنى معقّدة، مثل الجهاز والموقع الجغرافي والتجارة الإلكترونية وعناصر السجلّ المتكرّرة. هذه هي البُنى التي تتطلّب تسطيحًا لإعداد ملفات تعريف فعّالة.

تسوية البيانات باستخدام "طرق العرض المادية"

يُعدّ إنشاء "طرق عرض مجسّمة" (MVs) الحل الأكثر فعالية وعملية لمشكلة البيانات المتداخلة هذه. من خلال إجراء العمليات الحسابية المسبقة للنتائج المسطّحة، توفّر "العروض المادية" مزايا كبيرة في أداء طلب البحث وتكلفته، مع توفير بنية أبسط تشبه البنية العلائقية لأدوات التحليل وإنشاء الملفات الشخصية.

قد يكون أول ما يخطر في بالك هو دمج كل شيء في عرض واحد ضخم. ومع ذلك، يخفي هذا النهج البسيط فخًا خطيرًا يمكن أن يؤدي إلى تلف البيانات بشكل كبير. لنتعرّف على سبب اعتبار هذا الخطأ فادحًا.

  1. mv_ga4_user_session_flat.sql
CREATE OR REPLACE MATERIALIZED VIEW `$PROJECT_ID.$DATASET_ID.mv_ga4_user_session_flat`
OPTIONS (
  enable_refresh = true,
  refresh_interval_minutes = 30
) AS
SELECT
  event_date, event_timestamp, event_name, user_pseudo_id, user_id, stream_id, platform,
  device.category AS device_category,
  device.operating_system AS device_os,
  device.operating_system_version AS device_os_version,
  device.language AS device_language,
  device.web_info.browser AS device_browser,
  geo.continent AS geo_continent,
  geo.country AS geo_country,
  geo.region AS geo_region,
  geo.city AS geo_city,
  traffic_source.name AS traffic_source_name,
  traffic_source.medium AS traffic_source_medium,
  traffic_source.source AS traffic_source_source
FROM
  `$PROJECT_ID.$DATASET_ID.ga4_transactions`;
  1. mv_ga4_ecommerce_transactions.sql
CREATE OR REPLACE MATERIALIZED VIEW `$PROJECT_ID.$DATASET_ID.mv_ga4_ecommerce_transactions`
OPTIONS (
  enable_refresh = true,
  refresh_interval_minutes = 30
) AS
SELECT
  event_date, event_timestamp, user_pseudo_id, ecommerce.transaction_id,
  ecommerce.total_item_quantity,
  ecommerce.purchase_revenue_in_usd,
  ecommerce.purchase_revenue,
  ecommerce.refund_value_in_usd,
  ecommerce.refund_value,
  ecommerce.shipping_value_in_usd,
  ecommerce.shipping_value,
  ecommerce.tax_value_in_usd,
  ecommerce.tax_value,
  ecommerce.unique_items
FROM
  `$PROJECT_ID.$DATASET_ID.ga4_transactions`
WHERE
  ecommerce.transaction_id IS NOT NULL;
  1. mv_ga4_ecommerce_items.sql
CREATE OR REPLACE MATERIALIZED VIEW `$PROJECT_ID.$DATASET_ID.mv_ga4_ecommerce_items`
OPTIONS (
  enable_refresh = true,
  refresh_interval_minutes = 30
) AS
SELECT
  event_date, event_timestamp, event_name, user_pseudo_id, ecommerce.transaction_id,
  item.item_id,
  item.item_name,
  item.item_brand,
  item.item_variant,
  item.item_category,
  item.item_category2,
  item.item_category3,
  item.item_category4,
  item.item_category5,
  item.price_in_usd,
  item.price,
  item.quantity,
  item.item_revenue_in_usd,
  item.item_revenue,
  item.coupon,
  item.affiliation,
  item.item_list_name,
  item.promotion_name
FROM
  `$PROJECT_ID.$DATASET_ID.ga4_transactions`,
  UNNEST(items) AS item
WHERE
  ecommerce.transaction_id IS NOT NULL;

الآن، شغِّل هذه النماذج باستخدام أداة سطر الأوامر bq. سيقرأ الأمر envsubst كل ملف، ويستبدل المتغيرات مثل $PROJECT_ID و$DATASET_ID بقيمها من بيئة shell، وينقل SQL النهائي والصالح إلى أمر طلب البحث bq.

envsubst < mv_ga4_user_session_flat.sql | bq query --use_legacy_sql=false
envsubst < mv_ga4_ecommerce_transactions.sql | bq query --use_legacy_sql=false
envsubst < mv_ga4_ecommerce_items.sql | bq query --use_legacy_sql=false

تنفيذ عمليات فحص الملفات الشخصية من خلال عميل Python

بعد أن أصبح لدينا عروض مسطّحة وقابلة للإنشاء، يمكننا إنشاء عمليات فحص لملفات بيانات Dataplex وتشغيلها لكل منها آليًا. يستخدم نص Python البرمجي التالي مكتبة برامج google-cloud-dataplex لأتمتة هذه العملية.

قبل تشغيل النص البرمجي، من أفضل الممارسات المهمة إنشاء بيئة Python معزولة داخل دليل مشروعك. يضمن ذلك إدارة التبعيات الخاصة بالمشروع بشكل منفصل، ما يمنع حدوث تعارضات مع الحِزم الأخرى في بيئة Cloud Shell.

# Create the virtual environment
python3 -m venv dq_venv

# Activate the environment
source dq_venv/bin/activate

الآن، ثبِّت مكتبة برامج Dataplex داخل البيئة التي تم تفعيلها حديثًا.

# Install the Dataplex client library
pip install google-cloud-dataplex

بعد إعداد البيئة وتثبيت المكتبة، تكون جاهزًا لإنشاء نص برمجي للتنسيق.

في شريط أدوات Cloud Shell، انقر على "فتح المحرّر". أنشئ ملفًا جديدًا باسم 1_run_dataplex_scans.py والصِق فيه رمز Python التالي. إذا استنسخت مستودع GitHub، سيكون هذا الملف متوفّرًا في مجلدك.

سينشئ هذا النص البرمجي عملية فحص لكل "عرض مجسّم" (إذا لم يكن متوفّرًا بعد)، ويُجري عملية الفحص، ثم يستقصي إلى أن تكتمل جميع مهام الفحص.

import os
import sys
import time
from google.cloud import dataplex_v1
from google.api_core.exceptions import AlreadyExists


def create_and_run_scan(
    client: dataplex_v1.DataScanServiceClient,
    project_id: str,
    location: str,
    data_scan_id: str,
    target_resource: str,
) -> dataplex_v1.DataScanJob | None:
    """
    Creates and runs a single data profile scan.
    Returns the executed Job object without waiting for completion.
    """
    parent = client.data_scan_path(project_id, location, data_scan_id).rsplit('/', 2)[0]
    scan_path = client.data_scan_path(project_id, location, data_scan_id)

    # 1. Create Data Scan (skips if it already exists)
    try:
        data_scan = dataplex_v1.DataScan()
        data_scan.data.resource = target_resource
        data_scan.data_profile_spec = dataplex_v1.DataProfileSpec()

        print(f"[INFO] Creating data scan '{data_scan_id}'...")
        client.create_data_scan(
            parent=parent,
            data_scan=data_scan,
            data_scan_id=data_scan_id
        ).result()  # Wait for creation to complete
        print(f"[SUCCESS] Data scan '{data_scan_id}' created.")
    except AlreadyExists:
        print(f"[INFO] Data scan '{data_scan_id}' already exists. Skipping creation.")
    except Exception as e:
        print(f"[ERROR] Error creating data scan '{data_scan_id}': {e}")
        return None

    # 2. Run Data Scan
    try:
        print(f"[INFO] Running data scan '{data_scan_id}'...")
        run_response = client.run_data_scan(name=scan_path)
        print(f"[SUCCESS] Job started for '{data_scan_id}'. Job ID: {run_response.job.name.split('/')[-1]}")
        return run_response.job
    except Exception as e:
        print(f"[ERROR] Error running data scan '{data_scan_id}': {e}")
        return None


def main():
    """Main execution function"""
    # --- Load configuration from environment variables ---
    PROJECT_ID = os.environ.get("PROJECT_ID")
    LOCATION = os.environ.get("LOCATION")
    DATASET_ID = os.environ.get("DATASET_ID")

    if not all([PROJECT_ID, LOCATION, DATASET_ID]):
        print("[ERROR] One or more required environment variables are not set.")
        print("Please ensure PROJECT_ID, LOCATION, and DATASET_ID are exported in your shell.")
        sys.exit(1)

    print(f"[INFO] Using Project: {PROJECT_ID}, Location: {LOCATION}, Dataset: {DATASET_ID}")

    # List of Materialized Views to profile
    TARGET_VIEWS = [
        "mv_ga4_user_session_flat",
        "mv_ga4_ecommerce_transactions",
        "mv_ga4_ecommerce_items"
    ]
    # ----------------------------------------------------

    client = dataplex_v1.DataScanServiceClient()
    running_jobs = []

    # 1. Create and run jobs for all target views
    print("\n--- Starting Data Profiling Job Creation and Execution ---")
    for view_name in TARGET_VIEWS:
        data_scan_id = f"profile-scan-{view_name.replace('_', '-')}"
        target_resource = f"//bigquery.googleapis.com/projects/{PROJECT_ID}/datasets/{DATASET_ID}/tables/{view_name}"

        job = create_and_run_scan(client, PROJECT_ID, LOCATION, data_scan_id, target_resource)
        if job:
            running_jobs.append(job)
    print("-------------------------------------------------------\n")

    if not running_jobs:
        print("[ERROR] No jobs were started. Exiting.")
        return

    # 2. Poll for all jobs to complete
    print("--- Monitoring job completion status (checking every 30 seconds) ---")
    completed_jobs = {}

    while running_jobs:
        jobs_to_poll_next = []

        print(f"\n[STATUS] Checking status for {len(running_jobs)} running jobs...")

        for job in running_jobs:
            job_id_short = job.name.split('/')[-1][:13] 
            try:
                updated_job = client.get_data_scan_job(name=job.name)
                state = updated_job.state

                if state in (dataplex_v1.DataScanJob.State.RUNNING, dataplex_v1.DataScanJob.State.PENDING, dataplex_v1.DataScanJob.State.CANCELING):
                    print(f"  - Job {job_id_short}... Status: {state.name}")
                    jobs_to_poll_next.append(updated_job) 
                else:
                    print(f"  - Job {job_id_short}... Status: {state.name} (Complete)")
                    completed_jobs[job.name] = updated_job

            except Exception as e:
                print(f"[ERROR] Could not check status for job {job_id_short}: {e}")

        running_jobs = jobs_to_poll_next

        if running_jobs:
            time.sleep(30)

    # 3. Print final results
    print("\n--------------------------------------------------")
    print("[SUCCESS] All data profiling jobs have completed.")
    print("\nFinal Job Status Summary:")
    for job_name, job in completed_jobs.items():
        job_id_short = job_name.split('/')[-1][:13]
        print(f"  - Job {job_id_short}: {job.state.name}")
        if job.state == dataplex_v1.DataScanJob.State.FAILED:
            print(f"    - Failure Message: {job.message}")

    print("\nNext step: Analyze the profile results and generate quality rules.")


if __name__ == "__main__":
    main()

الآن، نفِّذ النص البرمجي من وحدة Cloud Shell الطرفية.

python 1_run_dataplex_scans.py

سيدير النص البرمجي الآن عملية إنشاء ملفات تعريف لـ Materialized Views الثلاثة، ما يتيح تقديم آخر المعلومات عن الحالة في الوقت الفعلي. بعد اكتمال هذه العملية، سيتوفّر لديك ملف إحصائي غني وقابل للقراءة آليًا لكل طريقة عرض، وستكون جاهزًا للمرحلة التالية من سير العمل: إنشاء قواعد جودة البيانات المستندة إلى الذكاء الاصطناعي.

يمكنك الاطّلاع على عمليات فحص الملفات الشخصية المكتملة في Google Cloud Console.

  1. في قائمة التنقّل، انتقِل إلى "كتالوج Dataplex الشامل" و"الملف الشخصي" في قسم "الإدارة".

5acda859404968c.png

  1. ستظهر لك عمليات البحث الثلاث عن الملف الشخصي، بالإضافة إلى أحدث حالة وظيفة. يمكنك النقر على عملية فحص للاطّلاع على النتائج التفصيلية.

8a09dae0ef485289.png

من ملف BigQuery إلى الإدخال الجاهز للاستخدام في الذكاء الاصطناعي

تم تشغيل عمليات فحص ملفات Dataplex الشخصية بنجاح. على الرغم من أنّ النتائج تتوفّر ضمن Dataplex API، لاستخدامها كمدخل لنموذج الذكاء الاصطناعي التوليدي، علينا استخراجها إلى ملف محلي منظَّم.

يعثر نص Python البرمجي التالي، 2_dq_profile_save.py، آليًا على أحدث مهمة ناجحة لفحص الملف الشخصي للعرض mv_ga4_user_session_flat. بعد ذلك، يستردّ نتيجة الملف الشخصي الكاملة والمفصّلة ويحفظها كملف JSON محلي باسم dq_profile_results.json. سيكون هذا الملف بمثابة الإدخال المباشر لتحليل الذكاء الاصطناعي في الخطوة التالية.

في أداة تعديل Cloud Shell، أنشئ ملفًا جديدًا باسم 2_dq_profile_save.py وألصِق الرمز التالي فيه. كما هو الحال في الخطوة السابقة، يمكنك تخطّي إنشاء ملف إذا نسخت المستودع.

import os
import sys
import json
from google.cloud import dataplex_v1
from google.api_core.exceptions import NotFound
from google.protobuf.json_format import MessageToDict

# --- Configuration ---
# The Materialized View to analyze is fixed for this step.
TARGET_VIEW = "mv_ga4_user_session_flat"
OUTPUT_FILENAME = "dq_profile_results.json"


def save_to_json_file(content: dict, filename: str):
    """Saves the given dictionary content to a JSON file."""
    try:
        with open(filename, "w", encoding="utf-8") as f:
            # Use indent=2 for a readable, "pretty-printed" JSON file.
            json.dump(content, f, indent=2, ensure_ascii=False)
        print(f"\n[SUCCESS] Profile results were saved to '{filename}'.")
    except (IOError, TypeError) as e:
        print(f"[ERROR] An error occurred while saving the file: {e}")


def get_latest_successful_job(
    client: dataplex_v1.DataScanServiceClient,
    project_id: str,
    location: str,
    data_scan_id: str
) -> dataplex_v1.DataScanJob | None:
    """Finds and returns the most recently succeeded job for a given data scan."""
    scan_path = client.data_scan_path(project_id, location, data_scan_id)
    print(f"\n[INFO] Looking for the latest successful job for scan '{data_scan_id}'...")

    try:
        # List all jobs for the specified scan, which are ordered most-recent first.
        jobs_pager = client.list_data_scan_jobs(parent=scan_path)

        # Iterate through jobs to find the first one that succeeded.
        for job in jobs_pager:
            if job.state == dataplex_v1.DataScanJob.State.SUCCEEDED:
                return job

        # If no successful job is found after checking all pages.
        return None
    except NotFound:
        print(f"[WARN] No scan history found for '{data_scan_id}'.")
        return None


def main():
    """Main execution function."""
    # --- Load configuration from environment variables ---
    PROJECT_ID = os.environ.get("PROJECT_ID")
    LOCATION = os.environ.get("LOCATION")

    if not all([PROJECT_ID, LOCATION]):
        print("[ERROR] Required environment variables PROJECT_ID or LOCATION are not set.")
        sys.exit(1)

    print(f"[INFO] Using Project: {PROJECT_ID}, Location: {LOCATION}")
    print(f"--- Starting Profile Retrieval for: {TARGET_VIEW} ---")

    # Construct the data_scan_id based on the target view name.
    data_scan_id = f"profile-scan-{TARGET_VIEW.replace('_', '-')}"

    # 1. Initialize Dataplex client and get the latest successful job.
    client = dataplex_v1.DataScanServiceClient()
    latest_job = get_latest_successful_job(client, PROJECT_ID, LOCATION, data_scan_id)

    if not latest_job:
        print(f"\n[ERROR] No successful job record was found for '{data_scan_id}'.")
        print("Please ensure the 'run_dataplex_scans.py' script has completed successfully.")
        return

    job_id_short = latest_job.name.split('/')[-1]
    print(f"[SUCCESS] Found the latest successful job: '{job_id_short}'.")

    # 2. Fetch the full, detailed profile result for the job.
    print(f"[INFO] Retrieving detailed profile results for job '{job_id_short}'...")
    try:
        request = dataplex_v1.GetDataScanJobRequest(
            name=latest_job.name,
            view=dataplex_v1.GetDataScanJobRequest.DataScanJobView.FULL,
        )
        job_with_full_results = client.get_data_scan_job(request=request)
    except Exception as e:
        print(f"[ERROR] Failed to retrieve detailed job results: {e}")
        return

    # 3. Convert the profile result to a dictionary and save it to a JSON file.
    if job_with_full_results.data_profile_result:
        profile_dict = MessageToDict(job_with_full_results.data_profile_result._pb)
        save_to_json_file(profile_dict, OUTPUT_FILENAME)
    else:
        print("[WARN] The job completed, but no data profile result was found within it.")

    print("\n[INFO] Script finished successfully.")


if __name__ == "__main__":
    main()

الآن، شغِّل النص البرمجي من الوحدة الطرفية:

python 2_dq_profile_save.py

بعد اكتمال العملية بنجاح، سيظهر ملف جديد باسم dq_profile_results.json في الدليل. يحتوي هذا الملف على بيانات التعريف الإحصائية الغنية والمفصّلة التي سنستخدمها لإنشاء قواعد جودة البيانات. إذا أردت التحقّق من محتوى dq_profile_results.json، نفِّذ الأمر التالي:

cat dq_profile_results.json

4. إنشاء قواعد جودة البيانات باستخدام واجهة سطر الأوامر في Gemini

تثبيت Gemini CLI وإعداده

على الرغم من إمكانية استدعاء Gemini API آليًا، يوفّر استخدام أداة مثل Gemini CLI طريقة فعّالة وتفاعلية لدمج الذكاء الاصطناعي التوليدي مباشرةً في مسارات عملك على الجهاز. إنّ Gemini CLI ليس مجرد برنامج دردشة آلي، بل هو أداة لسير العمل عبر سطر الأوامر يمكنها قراءة ملفاتك المحلية وفهم الرموز البرمجية والتفاعل مع أدوات النظام الأخرى، مثل gcloud، لتنفيذ المهام المعقّدة آليًا. وهذا ما يجعلها مثالية لحالة الاستخدام لدينا.

المتطلبات الأساسية

أولاً، تأكَّد من توفّر المتطلبات الأساسية اللازمة: يجب تثبيت الإصدار 20 من Node.js أو إصدار أحدث في بيئة Cloud Shell. يمكنك التحقّق من الإصدار عن طريق تشغيل node -v.

التثبيت

هناك طريقتان لاستخدام واجهة سطر الأوامر في Gemini: التثبيت المؤقت أو التثبيت الدائم. سنتناول الطريقتين هنا.

يمكنك تشغيل واجهة سطر الأوامر في Gemini مباشرةً لجلسة واحدة بدون أي تثبيت دائم. هذه هي الطريقة الأسهل والأسرع لتجربة الميزة، لأنّها لا تعدّل بيئتك على الإطلاق.

في وحدة Cloud Shell الطرفية، شغِّل الأمر التالي:

npx https://github.com/google-gemini/gemini-cli

يعمل هذا الأمر على تنزيل حزمة واجهة سطر الأوامر وتشغيلها مؤقتًا.

بالنسبة إلى أي مشروع حقيقي، فإنّ أفضل الممارسات التي يُنصح بها هي تثبيت واجهة سطر الأوامر محليًا في دليل مشروعك. يقدّم هذا الأسلوب العديد من المزايا الرئيسية:

  • عزل التبعيات: يضمن أن يتضمّن مشروعك إصدارًا خاصًا به من واجهة سطر الأوامر، ما يمنع حدوث تعارضات في الإصدارات مع المشاريع الأخرى.
  • إمكانية إعادة الإنتاج: يمكن لأي مستخدم يستنسخ مشروعك تثبيت التبعيات نفسها تمامًا، ما يجعل عملية الإعداد موثوقة وقابلة للنقل.
  • التوافق مع أفضل الممارسات: يتّبع هذا الخيار النموذج العادي لإدارة تبعيات مشاريع Node.js، ما يتيح تجنُّب المشاكل المرتبطة بعمليات التثبيت العامة (-g).

لتثبيت واجهة سطر الأوامر محليًا، نفِّذ الأمر التالي من مجلد مشروعك (programmatic-dq):

npm install @google/gemini-cli

سيؤدي ذلك إلى إنشاء مجلد node_modules داخل programmatic-dq. لتشغيل الإصدار الذي ثبَّته للتو، استخدِم الأمر npx.

npx gemini

الإعداد للمرة الأولى

أيًا كانت الطريقة التي تختارها، سيتم توجيهك خلال عملية إعداد لمرة واحدة عند تشغيل واجهة سطر الأوامر لأول مرة.

8a25fab5951c6c39.png

سيُطلب منك اختيار لون المظهر ثم إثبات الهوية. أبسط طريقة هي تسجيل الدخول باستخدام حسابك على Google عندما يُطلب منك ذلك. تكون الطبقة المجانية المقدَّمة كافية لهذا الدرس العملي.

بعد تثبيت واجهة سطر الأوامر وإعدادها، يمكنك الآن المتابعة لإنشاء القواعد. تدرك واجهة سطر الأوامر الملفات الموجودة في الدليل الحالي، وهو أمر بالغ الأهمية للخطوة التالية.

إنشاء قواعد جودة البيانات

مع أنّه من الممكن أن تطلب من نموذج لغوي كبير إنشاء ملف إعداد دفعة واحدة، إلا أنّ الطبيعة غير الحتمية للنماذج التوليدية تعني أنّ الناتج قد لا يكون دائمًا متوافقًا تمامًا مع المخطط الصارم الذي تتطلبه أدوات مثل gcloud. تتمثّل الطريقة الأكثر موثوقية في عملية تفاعلية متعدّدة الخطوات، حيث يعمل الذكاء الاصطناعي أولاً كمحلّل لاقتراح خطة، ثم تراجع أنت (الخبير البشري) هذه الخطة وتوافق عليها، وبعد ذلك فقط ينشئ الذكاء الاصطناعي الرمز النهائي استنادًا إلى التعليمات التي وافقت عليها.

يحوّل هذا النهج العملية من أمر بسيط إلى جلسة تعاونية، ما يضمن أن يكون الناتج النهائي دقيقًا وتم التحقّق منه وجاهزًا للنشر.

أولاً، سنطلب من Gemini تحليل الملف الإحصائي والعمل كمهندس بيانات خبير، واقتراح خطة عمل. نطلب منه بشكل صريح عدم كتابة ملف YAML بعد. ويركّز هذا النوع على التحليل والتبرير.

في جلسة Gemini CLI التفاعلية، الصِق الطلب التالي:

cd9792a6f1eb9f3.png

You are an expert Google Cloud Dataplex engineer. 
Your first task is to create a plan. I have a file in the current directory named ./dq_profile_results.json. 
Based on the statistical data within that file, propose a step-by-step plan to create a Dataplex data quality rules file. 
Your plan should identify which specific columns are good candidates for rules like nonNullExpectation, setExpectation, or rangeExpectation, and explain why based on the metrics (e.g., "Plan to create a nonNullExpectation for column X because its null percentage is 0%"). 
Do not write the YAML file yet. Just provide the plan.

سيحلّل Gemini ملف JSON وسيعرض خطة منظَّمة مشابهة لما يلي:

Plan to create Dataplex data quality rules

1. Create a row count rule:
  - Analysis: The profile shows a total of 26,489 rows.
  - Proposed Rule: I will implement a rowCount rule to ensure the table's row count remains within a healthy range (e.g., 20,000 to 30,000). This is a fundamental check to guard against major data loading failures or unexpected deletions.
2. Implement non-null expectation rules:
  - Analysis: The profiling results show that many columns have no null values. For example, event_date, event_timestamp, event_name, user_pseudo_id, stream_id, and platform all appear to be fully populated.
  - Proposed Rules: I will create nonNullExpectation rules for columns where the nullRatio is 0 or not present, indicating they are always expected to contain a value:
    - event_date
    - event_timestamp
    - event_name
    - user_pseudo_id
    - stream_id
    - platform
    - device_category
    - device_os
3. Implement set expectation rules:
  - Analysis: Several columns contain a small, finite set of values, making them ideal for set validation.
  - Proposed Rules: I will create setExpectation rules for these columns:
    - platform: It only contains the value "WEB".
    - device_category: It contains only "desktop", "mobile", and "tablet".
    - geo_continent: It has a well-defined list of continents.
traffic_source_medium: It has a small list of valid mediums like "organic", "(none)", and "referral".
4. Implement range expectation rules:
  - Analysis: The profile provides minimum and maximum values for numeric and string length fields.
  - Proposed Rules: I will create rangeExpectation rules for the following:
    - event_timestamp: The profile shows a clear min and max. I will use these values to create a range check.
    - event_date (String Length): The profile indicates that the minLength and maxLength are both 8, which is perfect for enforcing a YYYYMMDD format.

هذه هي الخطوة الأكثر أهمية في سير العمل بأكمله: مراجعة "المشاركة البشرية" (HITL). تستند الخطة التي ينشئها Gemini إلى الأنماط الإحصائية في البيانات فقط. ولا يمكنه فهم سياق نشاطك التجاري أو التغييرات المستقبلية في البيانات أو النية المحدّدة وراء بياناتك. دورك كخبير بشري هو التحقّق من صحة هذه الخطة وتصحيحها والموافقة عليها قبل تحويلها إلى رمز.

راجِع الخطة التي قدّمها Gemini بعناية.

  • هل هذا منطقي؟
  • هل تتوافق مع معرفتك بنشاطك التجاري؟
  • هل هناك أي قواعد سليمة إحصائيًا ولكنها غير مفيدة عمليًا؟

قد يختلف الناتج الذي تتلقّاه من Gemini. وهدفك هو تحسينها.

على سبيل المثال، لنفترض أنّ الخطة تقترح قاعدة rowCount لأنّ الجدول يتضمّن عددًا ثابتًا من الصفوف في البيانات النموذجية. بصفتك خبيرًا بشريًا، قد تعرف أنّ حجم هذا الجدول من المتوقّع أن يزداد يوميًا، ما يجعل قاعدة عدد الصفوف الصارمة غير عملية ومن المحتمل أن تتسبّب في تنبيهات خاطئة. هذا مثال مثالي على تطبيق سياق الأعمال الذي يفتقر إليه الذكاء الاصطناعي.

الآن، ستُقدّم ملاحظاتك إلى Gemini وتمنحه الأمر النهائي لإنشاء الرمز البرمجي. يجب تعديل الطلب التالي استنادًا إلى الخطة التي تلقّيتها فعلاً والتصحيحات التي تريد إجراؤها.

الطلب أدناه هو نموذج. السطر الأول هو المكان الذي ستُدخل فيه التصحيحات المحدّدة. إذا كانت الخطة التي قدّمها لك Gemini مثالية ولا تحتاج إلى أي تغييرات، يمكنك ببساطة حذف هذا السطر.

في جلسة Gemini نفسها، الصِق النسخة المعدَّلة من الطلب التالي:

[YOUR CORRECTIONS AND APPROVAL GO HERE. Examples:
- "The plan looks good. Please proceed."
- "The rowCount rule is not necessary, as the table size changes daily. The rest of the plan is approved. Please proceed."
- "For the setExpectation on the geo_continent column, please also include 'Antarctica'."]

Once you have incorporated my feedback, please generate the `dq_rules.yaml` file.

You must adhere to the following strict requirements:

- Schema Compliance: The YAML structure must strictly conform to the DataQualityRule specification. For a definitive source of truth, you must refer to the sample_rule.yaml file in the current directory and the DataQualityRule class definition in the local virtual environment path: ./dq_venv/.../google/cloud/dataplex_v1/types/data_quality.py.

- Data-Driven Values: All rule parameters, such as thresholds or expected values, must be derived directly from the statistical metrics in dq_profile_results.json.

- Rule Justification: For each rule, add a comment (#) on the line above explaining the justification, as you outlined in your plan.

- Output Purity: The final output must only be the raw YAML code block, perfectly formatted and ready for immediate deployment.

سينشئ Gemini الآن محتوى YAML استنادًا إلى تعليماتك الدقيقة التي تم التحقّق منها من قِبل العنصر البشري. بعد اكتمال العملية، سيظهر ملف جديد باسم dq_rules.yaml في دليل العمل.

إنشاء عملية فحص جودة البيانات وتشغيلها

بعد الحصول على ملف dq_rules.yaml من إنشاء الذكاء الاصطناعي وتمت مراجعته من قِبل فريقنا، يمكنك نشره بثقة.

اخرج من واجهة سطر الأوامر في Gemini عن طريق كتابة /quit أو الضغط على Ctrl+C مرتين.

ينشئ أمر gcloud التالي موردًا جديدًا لفحص بيانات Dataplex. لا يتم تشغيل عملية الفحص بعد، بل يتم ببساطة تسجيل تعريف عملية الفحص وإعداداتها (ملف YAML) في Dataplex.

نفِّذ الأمر التالي في الوحدة الطرفية:

export DQ_SCAN="dq-scan"
gcloud dataplex datascans create data-quality $DQ_SCAN \
    --project=$PROJECT_ID \
    --location=$REGION \
    --data-quality-spec-file=dq_rules.yaml \
    --data-source-resource="//bigquery.googleapis.com/projects/$PROJECT_ID/datasets/$DATASET_ID/tables/mv_ga4_user_session_flat"

بعد تحديد عملية البحث الآن، يمكنك تشغيل مهمة لتنفيذها.

gcloud dataplex datascans run $DQ_SCAN --location=$REGION --project=$PROJECT_ID

سيؤدي هذا الأمر إلى عرض معرّف مهمة. يمكنك مراقبة حالة هذه المهمة في قسم Dataplex في Google Cloud Console. بعد اكتمال العملية، ستتم كتابة النتائج في جدول BigQuery لتحليلها.

5- الدور المهم لنهج "المشاركة البشرية" (HITL)

على الرغم من أنّ استخدام Gemini لتسريع عملية إنشاء القواعد فعّال للغاية، من الضروري التعامل مع الذكاء الاصطناعي على أنّه مساعد ماهر جدًا، وليس طيارًا مستقلًا تمامًا. إنّ عملية "المشاركة البشرية" (HITL) ليست اقتراحًا اختياريًا، بل هي خطوة أساسية لا يمكن التغاضي عنها في أي سير عمل قوي وموثوق لإدارة البيانات. إنّ مجرد نشر نتائج من إنشاء الذكاء الاصطناعي بدون إشراف بشري دقيق هو وصفة للفشل.

يمكنك اعتبار dq_rules.yaml الذي تم إنشاؤه باستخدام الذكاء الاصطناعي بمثابة طلب سحب أرسله مطوّر ذكاء اصطناعي سريع جدًا ولكنّه عديم الخبرة. ويتطلّب ذلك مراجعة شاملة من خبير بشري رفيع المستوى، أي أنت، قبل أن يتم دمجه في "الفرع الرئيسي" لسياسة الحوكمة ونشره. هذه المراجعة ضرورية للحدّ من نقاط الضعف المتأصلة في النماذج اللغوية الكبيرة.

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

1. التحقّق من الصحة في السياق: يفتقر الذكاء الاصطناعي إلى الوعي بالنشاط التجاري

  • نقطة ضعف النماذج اللغوية الكبيرة: النماذج اللغوية الكبيرة بارعة في التعامل مع الأنماط والإحصاءات، ولكنّها لا تفهم سياق نشاطك التجاري. على سبيل المثال، إذا كان أحد الأعمدة، new_campaign_id، يتضمّن نسبة فارغة تبلغ% 98، قد تتجاهل نماذج اللغة الكبيرة هذا العمود لسبب إحصائي.
  • الدور المهم للمستخدم: بصفتك خبيرًا، أنت تعلم أنّه تمت إضافة الحقل new_campaign_id أمس استعدادًا لإطلاق منتج رئيسي الأسبوع المقبل. أنت تعلم أنّ نسبة القيم الفارغة يجب أن تكون مرتفعة الآن، ولكن من المتوقّع أن تنخفض بشكل كبير. أنت تعلم أيضًا أنّه بعد ملء هذا الحقل، يجب أن يلتزم بتنسيق معيّن. لا يمكن للذكاء الاصطناعي استنتاج هذه المعلومات الخارجية عن المؤسسة. دورك هو تطبيق سياق النشاط التجاري هذا على الاقتراحات الإحصائية التي تقدّمها الذكاء الاصطناعي، وتعديلها أو تحسينها حسب الحاجة.

2- الصحة والدقة: الحماية من الهلوسة والأخطاء الطفيفة

  • نقطة ضعف النماذج اللغوية الكبيرة: يمكن أن تكون النماذج اللغوية الكبيرة "واثقة من خطئها". يمكن أن "تتوهم" أو تنشئ رمزًا برمجيًا غير صحيح بشكل طفيف. على سبيل المثال، قد ينشئ ملف YAML يتضمّن قاعدة مسمّاة بشكل صحيح ولكن مع مَعلمة غير صالحة، أو قد يخطئ في كتابة نوع قاعدة (مثل setExpectations بدلاً من setExpectation الصحيح). ستؤدي هذه الأخطاء الطفيفة إلى تعذُّر عملية النشر، ولكن قد يكون من الصعب رصدها.
  • الدور المهم للمراجع البشري: مهمتك هي العمل كأداة تدقيق نهائية للتعليمات البرمجية والتحقّق من صحة المخطط. عليك التحقّق بدقة من ملف YAML الذي تم إنشاؤه مقارنةً بمواصفات Dataplex الرسمية DataQualityRule. لا تتحقّق فقط مما إذا كان "يبدو صحيحًا"، بل تتحقّق من صحته النحوية والدلالية للتأكّد من أنّه متوافق بنسبة% 100 مع واجهة برمجة التطبيقات المستهدَفة. لهذا السبب، يطلب نموذج البرمجة من Gemini الرجوع إلى ملفات المخطط للحدّ من احتمال حدوث خطأ، ولكن تقع مسؤولية التحقّق النهائي على عاتقك.

3. السلامة والحدّ من المخاطر: منع العواقب اللاحقة

  • نقطة ضعف النموذج اللغوي الكبير: يمكن أن يكون لتطبيق قاعدة معيبة لجودة البيانات في مرحلة الإنتاج عواقب وخيمة. إذا اقترحت تكنولوجيات الذكاء الاصطناعي rangeExpectation لمبلغ معاملة مالية واسع جدًا، قد لا تتمكّن من رصد النشاط الاحتيالي. في المقابل، إذا اقترحت قاعدة صارمة جدًا استنادًا إلى عيّنة بيانات صغيرة، قد تؤدي إلى إغراق فريق الدعم بآلاف التنبيهات الإيجابية الخاطئة، ما يؤدي إلى الإرهاق من التنبيهات والتسبب في تفويت المشاكل الحقيقية.
  • الدور المهم الذي يلعبه الإنسان: أنت مهندس السلامة. عليك تقييم التأثير المحتمل لكل قاعدة يقترحها الذكاء الاصطناعي. اسألوا أنفسكم: "ماذا يحدث إذا لم تنجح هذه القاعدة؟ هل التنبيه قابل للتنفيذ؟ ما هو الخطر إذا تم اجتياز هذه القاعدة بشكل غير صحيح؟" إنّ تقييم المخاطر هو قدرة بشرية فريدة تقارن بين تكلفة الفشل وفوائد التحقّق.

4. الحوكمة كعملية مستمرة: دمج المعرفة الاستشرافية

  • نقطة ضعف النموذج اللغوي الكبير: تستند معلومات الذكاء الاصطناعي إلى لقطة ثابتة من البيانات، أي أنّ الملف الشخصي ينتج من نقطة زمنية محدّدة. ولا تتضمّن معلومات عن الأحداث المستقبلية.
  • الدور المهم للموظفين: يجب أن تكون استراتيجية الحوكمة استشرافية. أنت تعلم أنّه من المقرّر نقل مصدر بيانات في الشهر المقبل، ما سيؤدي إلى تغيير stream_id. أنت تعلم أنّه سيتمّ إضافة بلد جديد إلى قائمة geo_country. عملية HITL هي المكان الذي يتم فيه إدخال هذه المعرفة حول الحالة المستقبلية، وتعديل القواعد أو إيقافها مؤقتًا لمنع حدوث مشاكل أثناء التطورات المخطط لها في الأنشطة التجارية أو التكنولوجية. جودة البيانات ليست عملية إعداد لمرة واحدة، بل هي عملية مستمرة يجب أن تتطوّر، ولا يمكن لأحد سوى الإنسان توجيه هذا التطوّر.

باختصار، يشكّل HITL آلية أساسية لضمان الجودة والأمان، وهي تحوّل إدارة الذكاء الاصطناعي المستندة إلى الذكاء الاصطناعي من فكرة جديدة ولكنها محفوفة بالمخاطر إلى ممارسة مسؤولة وقابلة للتوسّع ومناسبة للمؤسسات. وهي تضمن أنّ السياسات النهائية التي يتم نشرها ليست معزّزة بالذكاء الاصطناعي فحسب، بل تم التحقّق منها أيضًا من قِبل خبراء، ما يجمع بين سرعة الآلات وحكمة الخبراء البشريين ومعرفتهم بالسياق.

ومع ذلك، لا يقلّل هذا التركيز على الإشراف البشري من قيمة الذكاء الاصطناعي. على العكس من ذلك، يؤدي الذكاء الاصطناعي التوليدي دورًا حاسمًا في تسريع عملية HITL نفسها.

بدون الذكاء الاصطناعي، على مهندس البيانات إجراء ما يلي:

  1. كتابة استعلامات SQL معقّدة يدويًا لإنشاء ملفات تعريف البيانات (مثل ‫COUNT DISTINCT وAVG وMIN وMAX لكل عمود).
  2. تحليل نتائج جداول البيانات بدقة
  3. كتابة كل سطر من ملف قاعدة YAML من البداية، وهي مهمة شاقة وعرضة للأخطاء

ويعمل الذكاء الاصطناعي على أتمتة هذه الخطوات الشاقة التي تستغرق وقتًا طويلاً. تعمل هذه الأداة كمحلّل لا يكلّ، إذ تعالج الملف الإحصائي على الفور وتقدّم "مسودة أولى" للسياسة منظَّمة بشكل جيد ومكتملة بنسبة% 80.

ويغيّر ذلك بشكل أساسي طبيعة عمل الإنسان. بدلاً من قضاء ساعات في تحليل البيانات يدويًا وكتابة الرموز النموذجية، يمكن للخبير البشري التركيز فورًا على المهام الأكثر أهمية:

  • تطبيق سياق الأعمال المهم.
  • التحقّق من صحة منطق الذكاء الاصطناعي
  • اتّخاذ قرارات استراتيجية بشأن القواعد المهمة حقًا

في هذه الشراكة، يتولّى الذكاء الاصطناعي مهمة تحديد "ماذا" (ما هي الأنماط الإحصائية؟)، ما يتيح للموظف التركيز على "لماذا" (لماذا هذا النمط مهم لنشاطنا التجاري؟) و "ماذا بعد" (ما هي السياسة التي يجب اتّباعها؟). لذلك، لا يحلّ الذكاء الاصطناعي محلّ هذه العملية، بل يجعل كل دورة فيها أسرع وأكثر ذكاءً وفعالية.

6. تنظيف البيئة

لتجنُّب تكبُّد رسوم مستقبلية على حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا الدرس البرمجي، عليك حذف المشروع الذي يحتوي على الموارد. ومع ذلك، إذا أردت الاحتفاظ بالمشروع، يمكنك حذف المراجع الفردية التي أنشأتها.

حذف عمليات فحص Dataplex

أولاً، احذف الملف الشخصي وعمليات فحص الجودة التي أنشأتها. لمنع حذف الموارد المهمة عن طريق الخطأ، تستخدم هذه الأوامر الأسماء المحدّدة لعمليات الفحص التي تم إنشاؤها في هذا الدرس العملي.

# Delete the Data Quality Scan
gcloud dataplex datascans delete dq-scan \
    --location=us-central1 \
    --project=$PROJECT_ID --quiet

# Delete the Data Profile Scans
gcloud dataplex data-scans delete profile-scan-mv-ga4-user-session-flat \
    --location=us-central1 \
    --project=$PROJECT_ID --quiet

gcloud dataplex data-scans delete profile-scan-mv-ga4-ecommerce-transactions \
    --location=us-central1 \
    --project=$PROJECT_ID --quiet

gcloud dataplex data-scans delete profile-scan-mv-ga4-ecommerce-items \
    --location=us-central1 \
    --project=$PROJECT_ID --quiet

حذف مجموعة بيانات BigQuery

بعد ذلك، احذف مجموعة بيانات BigQuery. لا يمكن التراجع عن هذا الأمر، ويستخدم العلامة -f (فرض) لإزالة مجموعة البيانات وجميع جداولها بدون تأكيد.

# Manually type this command to confirm you are deleting the correct dataset
bq rm -r -f --dataset $PROJECT_ID:dataplex_dq_codelab

7. تهانينا!

لقد أكملت تجربة الترميز بنجاح.

لقد أنشأت سير عمل متكاملاً آليًا لإدارة البيانات. بدأت باستخدام "طرق العرض المادية" لتسوية بيانات BigQuery المعقّدة، ما جعلها مناسبة للتحليل. بعد ذلك، أجريت عمليات فحص ملفات Dataplex الشخصية آليًا لإنشاء بيانات وصفية إحصائية. والأهم من ذلك، أنّك استفدت من واجهة سطر الأوامر في Gemini لتحليل ناتج الملف الشخصي وإنشاء عنصر dq_rules.yaml "سياسة كرمز" بذكاء. ثمّ استخدمت واجهة سطر الأوامر لنشر هذا الإعداد كعملية فحص مبرمَجة لجودة البيانات، ما يتيح لك إكمال دورة استراتيجية حوكمة حديثة وقابلة للتوسّع.

أصبحت الآن مجهّزًا بالنمط الأساسي لإنشاء أنظمة موثوقة وعالية الجودة للبيانات، ومزوّدة بميزات الذكاء الاصطناعي، وتم التحقّق من صحتها على Google Cloud.

الخطوات التالية

  • التكامل مع CI/CD: خذ ملف dq_rules.yaml واحفظه في مستودع Git. أنشئ مسار CI/CD (على سبيل المثال، باستخدام Cloud Build أو GitHub Actions) ينشر عملية فحص Dataplex تلقائيًا كلما تم تعديل ملف القاعدة.
  • استكشاف قواعد SQL المخصّصة: يمكنك استخدام أنواع القواعد غير العادية. تتيح Dataplex قواعد SQL مخصّصة لفرض منطق أكثر تعقيدًا خاصًا بالنشاط التجاري ولا يمكن التعبير عنه باستخدام عمليات التحقّق المحدّدة مسبقًا. هذه ميزة فعّالة لتخصيص عملية التحقّق حسب متطلباتك الفريدة.
  • تحسين عمليات البحث لزيادة الكفاءة وتقليل التكلفة: بالنسبة إلى الجداول الكبيرة جدًا، يمكنك تحسين الأداء وتقليل التكاليف من خلال عدم البحث دائمًا في مجموعة البيانات بأكملها. استكشِف إمكانية استخدام الفلاتر لتضييق نطاق الفحص إلى أُطر زمنية أو شرائح بيانات معيّنة، أو إعداد عمليات فحص مستنِدة إلى عيّنات للتحقّق من نسبة مئوية تمثيلية من بياناتك.
  • تصوُّر النتائج: تتم كتابة نتائج كل عملية فحص لجودة البيانات في Dataplex في جدول BigQuery. اربط هذا الجدول بأداة Looker Studio لإنشاء لوحات بيانات تتتبّع نتائج جودة بياناتك بمرور الوقت، ويتم تجميعها حسب السمات التي حدّدتها (مثل الاكتمال والصلاحية). ويجعل ذلك عملية المراقبة استباقية ومرئية لجميع الأطراف المعنية.
  • مشاركة أفضل الممارسات: شجِّع على مشاركة المعرفة داخل مؤسستك للاستفادة من الخبرة الجماعية وتحسين استراتيجية جودة البيانات. إنّ تعزيز ثقافة الثقة في البيانات هو المفتاح لتحقيق أقصى استفادة من جهود الحوكمة.
  • قراءة المستندات: