ساخت یک دریاچه داده یکپارچه برای هوش مصنوعی با آپاچی آیسبرگ و بیگ‌لیک

۱. مقدمه

در این آزمایشگاه کد، قابلیت‌های Unified Data Lakehouse در Google Cloud را بررسی خواهید کرد. با مجموعه داده‌های عمومی ارائه شده از طریق Apache Iceberg REST Catalog در BigLake تعامل خواهید داشت و سپس قابلیت‌های هوش مصنوعی Google Cloud را بر روی داده‌های ساختاریافته و بدون ساختار اعمال خواهید کرد.

شما با استفاده از Apache Iceberg به مجموعه داده‌های کلاسیک تاکسی نیویورک کوئری خواهید زد، برای بررسی تغییرات داده‌ها به Time Travel خواهید پرداخت و سپس از BigQuery ML و Gemini برای اجرای مدل‌های هوش مصنوعی روی داده‌های خود استفاده خواهید کرد.

کاری که انجام خواهید داد

  • از Google Cloud Serverless برای Apache Spark برای پرس‌وجو از مجموعه داده‌های عمومی Apache Iceberg میزبانی‌شده در BigLake استفاده کنید.
  • پرس و جوی داده‌های ساختاریافته در قالب آپاچی آیسبرگ.
  • سفر در زمان را در کوه یخ آپاچی نشان دهید.
  • از BigQuery ML برای آموزش یک مدل پیش‌بینی‌کننده روی داده‌های ساختاریافته استفاده کنید.
  • یک جدول شیء BigLake (داده‌های بدون ساختار) ایجاد کنید و از Gemini برای تجزیه و تحلیل تصاویر استفاده کنید.

آنچه نیاز دارید

  • یک مرورگر وب مانند کروم .
  • یک پروژه گوگل کلود با قابلیت پرداخت.

هزینه و مدت زمان مورد انتظار

  • زمان لازم برای تکمیل : حدود ۴۵ دقیقه
  • هزینه تخمینی : کمتر از ۲ دلار. ما از مجموعه داده‌های عمومی و پرس‌وجوهای بدون سرور برای پایین نگه داشتن هزینه‌ها استفاده می‌کنیم.

۲. تنظیمات و الزامات

در این مرحله، محیط خود را آماده کرده و APIهای لازم را فعال خواهید کرد.

شروع پوسته ابری

شما اکثر دستورات را از Google Cloud Shell اجرا خواهید کرد.

  1. روی فعال کردن پوسته ابری (Cloud Shell) در بالای کنسول گوگل کلود (Google Cloud) کلیک کنید.
  2. تأیید اعتبار:
    gcloud auth list
    
  3. پروژه خود را تایید کنید:
    gcloud config get project
    
  4. اگر پروژه تنظیم نشده است، آن را با استفاده از شناسه پروژه خود تنظیم کنید:
    gcloud config set project <YOUR_PROJECT_ID>
    

فعال کردن APIها

برای فعال کردن API های مورد نیاز برای BigQuery ، Cloud Resource Manager و Vertex AI ، دستور زیر را اجرا کنید:

gcloud services enable \
  bigquery.googleapis.com \
  aiplatform.googleapis.com \
  cloudresourcemanager.googleapis.com

پیکربندی محیط و ایجاد سطل وابستگی‌ها

  1. متغیرهای محیطی خود را در ترمینال خود تنظیم کنید:
    export PROJECT_ID=$(gcloud config get project)
    export REGION=us-central1
    export DEPS_BUCKET=$PROJECT_ID-deps-bucket
    
  2. مخزن ذخیره‌سازی ابری وابستگی‌ها را ایجاد کنید. اسکریپت‌های PySpark در زمان ارسال کار در اینجا آپلود می‌شوند:
    gcloud storage buckets create gs://$DEPS_BUCKET --location=$REGION
    

۳. به کاتالوگ عمومی آپاچی آیسبرگ متصل شوید

در این مرحله، شما به یک Apache Iceberg Catalogue زنده و در سطح عملیاتی که روی BigLake گوگل کلود میزبانی می‌شود، متصل خواهید شد.

اجرای Spark SQL با Serverless برای Apache Spark Batch CLI

ما از Google Cloud Serverless برای Apache Spark استفاده خواهیم کرد تا کارهای PySpark را بدون نیاز به مدیریت زیرساخت اجرا کنیم. ما آن را طوری پیکربندی خواهیم کرد که به کاتالوگ عمومی BigLake REST اشاره کند.

  1. ویژگی‌های کاتالوگ REST بیگ‌لیک را تعریف کنید تا از تکرار آنها جلوگیری شود. این پیکربندی به اسپارک می‌گوید:
    • برای استفاده از کتابخانه‌های iceberg-spark-runttime و iceberg-gcp-bundle .
    • برای پیکربندی کاتالوگی به نام my_catalog با استفاده از نقطه پایانی کاتالوگ BigLake REST .
    • برای استفاده از فضای ذخیره‌سازی ابری گوگل (GCS) برای خواندن فایل‌های داده به جای سیستم فایل محلی پیش‌فرض.
    • برای تنظیم این کاتالوگ my_catalog به عنوان پیش‌فرض برای جلسه ما.
    • استفاده از اعتبارنامه‌های فروش رفته برای امنیت بیشتر و دسترسی آسان‌تر به داده‌ها.
    export METASTORE_PROPERTIES="^|^spark.jars.packages=org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.10.0,org.apache.iceberg:iceberg-gcp-bundle:1.10.0|\
    spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog|\
    spark.sql.catalog.my_catalog.type=rest|\
    spark.sql.catalog.my_catalog.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog|\
    spark.sql.catalog.my_catalog.warehouse=gs://biglake-public-nyc-taxi-iceberg|\
    spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO|\
    spark.sql.catalog.my_catalog.header.x-goog-user-project=$PROJECT_ID|\
    spark.sql.catalog.my_catalog.header.X-Iceberg-Access-Delegation=vended-credentials|\
    spark.sql.catalog.my_catalog.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager|\
    spark.sql.defaultCatalog=my_catalog|\
    spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions|\
    spark.log.level=ERROR"
    
  2. یک فایل کوئری تست ساده ایجاد کنید:
    cat <<EOF > test.py
    from pyspark.sql import SparkSession
    
    spark = SparkSession.builder.getOrCreate()
    
    spark.sql("SHOW TABLES IN public_data").show()
    EOF
    
  3. ارسال کار دسته‌ای:
    gcloud dataproc batches submit pyspark \
      --project=$PROJECT_ID \
      --region=$REGION \
      --version=2.3 \
      --properties="$METASTORE_PROPERTIES" \
      --deps-bucket=gs://$DEPS_BUCKET \
      test.py
    
    باید خروجی مشابه زیر را ببینید:
    +-----------+----------------+-----------+
    |  namespace|       tableName|isTemporary|
    +-----------+----------------+-----------+
    |public_data|     nyc_taxicab|      false|
    |public_data|nyc_taxicab_2021|      false|
    +-----------+----------------+-----------+
    

۴. پرس‌وجوی داده‌های ساختاریافته‌ی کوه یخ

پس از اتصال، شما دسترسی کامل SQL به مجموعه داده‌ها خواهید داشت. ما مجموعه داده‌های تاکسی نیویورک را که به صورت یک جدول Iceberg مدل‌سازی شده است، پرس‌وجو خواهیم کرد.

اجرای پرس‌وجوی تجمیعی استاندارد

یک فایل با نام query.py ایجاد کنید:

cat <<EOF > query.py
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

query = """
SELECT
  passenger_count,
  COUNT(1) AS num_trips,
  ROUND(AVG(total_amount), 2) AS avg_fare,
  ROUND(AVG(trip_distance), 2) AS avg_distance
FROM public_data.nyc_taxicab
WHERE data_file_year = 2021 AND passenger_count > 0
GROUP BY passenger_count
ORDER BY num_trips DESC
"""

spark.sql(query).show()
EOF

و آن را با استفاده از Serverless برای Apache Spark ارسال کنید:

gcloud dataproc batches submit pyspark \
  --project=$PROJECT_ID \
  --region=$REGION \
  --version=2.3 \
  --properties="$METASTORE_PROPERTIES" \
  --deps-bucket=gs://$DEPS_BUCKET \
  query.py

باید خروجی مشابه این را در کنسول خود ببینید:

+---------------+---------+--------+------------+
|passenger_count|num_trips|avg_fare|avg_distance|
+---------------+---------+--------+------------+
|              1| 21508009|   18.82|        3.03|
|              2|  4424746|   20.22|        3.40|
|              3|  1164846|   19.84|        3.27|
|              5|   718282|   18.88|        3.07|
|              4|   466485|   20.61|        3.44|
|              6|   452467|   18.97|        3.11|
|              7|       78|   65.24|        3.71|
|              8|       49|   57.39|        5.88|
|              9|       35|   73.26|        6.20|
|             96|        1|   17.00|        2.00|
|            112|        1|   15.00|        2.00|
+---------------+---------+--------+------------+

چرا اینجا از آپاچی آیسبرگ استفاده کنیم؟

  • هرس پارتیشن : فیلترهای پرس و جو روی data_file_year = 2021 اعمال می‌شوند. Iceberg به موتور اجازه می‌دهد تا اسکن داده‌های سال‌های دیگر را به طور کامل نادیده بگیرد.
  • چابکی موتور : می‌توانید این را در Spark، Trino یا BigQuery بدون کپی کردن داده‌ها اجرا کنید!

۵. سفر در زمان در کوه یخ آپاچی

یکی از قدرتمندترین ویژگی‌های Iceberg، قابلیت سفر در زمان است. این قابلیت به شما امکان می‌دهد داده‌ها را همانطور که در نسخه قبلی یا اسنپ‌شات وجود داشته‌اند، جستجو کنید.

مشاهده تاریخچه جدول

یک فایل با نام history.py ایجاد کنید:

cat <<EOF > history.py
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

spark.sql("SELECT * FROM public_data.nyc_taxicab.history").show()
EOF

و ارسالش کنید:

gcloud dataproc batches submit pyspark \
  --project=$PROJECT_ID \
  --region=$REGION \
  --version=2.3 \
  --properties="$METASTORE_PROPERTIES" \
  --deps-bucket=gs://$DEPS_BUCKET \
  history.py

باید خروجی مشابه زیر را در کنسول خود مشاهده کنید:

+--------------------+-------------------+-------------------+-------------------+
|     made_current_at|        snapshot_id|          parent_id|is_current_ancestor|
+--------------------+-------------------+-------------------+-------------------+
|2026-01-07 21:32:...|6333415779680505547|               NULL|               true|
|2026-01-07 21:34:...|1840345522877675925|6333415779680505547|               true|
|2026-01-07 21:36:...|7203554539964460256|1840345522877675925|               true|
|2026-01-07 21:38:...|4573466015237516024|7203554539964460256|               true|
|2026-01-07 21:40:...|3353190952148867790|4573466015237516024|               true|
|2026-01-07 21:42:...|1335547378580631681|3353190952148867790|               true|
|2026-01-07 21:44:...|8203141258229894239|1335547378580631681|               true|
|2026-01-07 21:46:...|1597048231706307813|8203141258229894239|               true|
|2026-01-07 21:48:...|6247811509231462655|1597048231706307813|               true|
|2026-01-07 21:50:...|2527184310045633322|6247811509231462655|               true|
|2026-01-07 21:52:...|2512764101237223642|2527184310045633322|               true|
|2026-01-07 21:52:...|7045957533358062548|2512764101237223642|               true|
|2026-01-07 21:53:...| 531753237516076726|7045957533358062548|               true|
|2026-01-07 21:53:...|4184653573199718274| 531753237516076726|               true|
|2026-01-07 21:54:...|5125223829492177301|4184653573199718274|               true|
|2026-01-07 21:54:...|6844673237417600305|5125223829492177301|               true|
|2026-01-07 21:54:...|6634828203344518093|6844673237417600305|               true|
|2026-01-07 21:55:...|7637728273407236194|6634828203344518093|               true|
|2026-01-07 21:55:...|3424071684958740192|7637728273407236194|               true|
|2026-01-07 21:55:...|1743746294196424254|3424071684958740192|               true|
+--------------------+-------------------+-------------------+-------------------+

ردیف‌هایی را مشاهده خواهید کرد که نشان‌دهنده‌ی شناسه‌های مختلف اسنپ‌شات و زمان کامیت شدن آن‌ها هستند.

تعداد ردیف فعلی را در مقابل تعداد ردیف‌های قبلی مقایسه کنید

یک فایل با نام timetravel.py ایجاد کنید:

cat <<EOF > timetravel.py
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

query = """
SELECT 'Current State' AS version, COUNT(*) AS count FROM public_data.nyc_taxicab
UNION ALL
SELECT 'Past State' AS version, COUNT(*) AS count FROM public_data.nyc_taxicab VERSION AS OF 4573466015237516024
"""

spark.sql(query).show()
EOF

و ارسالش کنید:

gcloud dataproc batches submit pyspark \
  --project=$PROJECT_ID \
  --region=$REGION \
  --version=2.3 \
  --properties="$METASTORE_PROPERTIES" \
  --deps-bucket=gs://$DEPS_BUCKET \
  timetravel.py

باید خروجی مشابه زیر را در کنسول خود مشاهده کنید:

+-------------+----------+
|      version|     count|
+-------------+----------+
|Current State|1293069366|
|   Past State|  72878594|
+-------------+----------+

این تضمین می‌کند که شما می‌توانید تغییرات داده‌ها را در طول زمان حسابرسی کنید.

۶. هوش مصنوعی ساختاریافته با BigQuery ML

حالا که داده‌های Iceberg را بررسی کردید، بیایید از قابلیت‌های هوش مصنوعی BigQuery استفاده کنیم! از آنجایی که کاتالوگ عمومی Iceberg فقط خواندنی است، می‌توانیم از BigQuery برای آموزش یک مدل در فضای کاری خود با خواندن از جداول عمومی استفاده کنیم.

ایجاد یک مجموعه داده محلی

ابتدا، یک مجموعه داده در پروژه خود ایجاد کنید تا مدل هوش مصنوعی را با استفاده از bq CLI ذخیره کنید:

bq mk --location=$REGION --project_id=$PROJECT_ID iceberg_ai

آموزش یک مدل رگرسیون خطی

اکنون شما یک مدل رگرسیون خطی را با استفاده از جدول عمومی BigLake Iceberg آموزش خواهید داد.

یک فایل پرس‌وجو ایجاد کنید و مدل را با استفاده از bq query آموزش دهید:

cat <<'EOF' > train_model.sql
CREATE OR REPLACE MODEL `iceberg_ai.predict_fare`
OPTIONS(model_type='LINEAR_REG', input_label_cols=['fare_amount']) AS
SELECT fare_amount, passenger_count, CAST(trip_distance AS FLOAT64) AS trip_distance
FROM `bigquery-public-data`.`biglake-public-nyc-taxi-iceberg`.public_data.nyc_taxicab
WHERE fare_amount > 0 AND trip_distance > 0 AND RAND() < 0.01; -- Using 1% of data to downsample
EOF

bq query --location=$REGION --use_legacy_sql=false < train_model.sql

پیش‌بینی با استفاده از مدل

اکنون که مدل آموزش داده شده است، می‌توانید از آن برای پیش‌بینی مبلغ کرایه برای سفرهای جدید با استفاده از ML.PREDICT استفاده کنید.

یک فایل کوئری ایجاد کنید و پیش‌بینی را با استفاده از bq query اجرا کنید:

cat <<'EOF' > predict_fare.sql
SELECT
  predicted_fare_amount, passenger_count, trip_distance
FROM
  ML.PREDICT(MODEL `iceberg_ai.predict_fare`,
    (
    SELECT 2 AS passenger_count, 5.0 AS trip_distance
    )
  );
EOF

bq query --location=$REGION --use_legacy_sql=false < predict_fare.sql

باید خروجی مشابه زیر را ببینید:

+-----------------------+-----------------+---------------+
| predicted_fare_amount | passenger_count | trip_distance |
+-----------------------+-----------------+---------------+
|     14.12252095150709 |               2 |           5.0 |
+-----------------------+-----------------+---------------+

۷. هوش مصنوعی بدون ساختار با BigLake

داده‌ها فقط سطرها و ستون‌ها نیستند. Unified Data Lakehouses داده‌های بدون ساختار (تصاویر، فایل‌های PDF) را نیز مدیریت می‌کند. بیایید از Object Tables و Object References برای جستجوی داده‌های بدون ساختار استفاده کنیم.

جداول شیء ، جداول خارجی فقط خواندنی در BigQuery هستند که اشیاء را در یک مسیر ذخیره‌سازی ابری فهرست می‌کنند. هر ردیف نشان‌دهنده یک فایل است و ستون‌هایی برای ابرداده‌هایی مانند uri ، size و یک ستون ref ویژه حاوی ObjectRef دارد.

ارجاعات شیء ( ObjectRef ) به داده‌های واقعی یک فایل واحد اشاره می‌کنند. توابع مدرن BigQuery ML (مانند AI.GENERATE یا AI.AGG ) از ObjectRef برای خواندن محتوای فایل (تصاویر، صدا یا متن) برای تجزیه و تحلیل بدون بارگذاری بایت‌ها در یک جدول استاندارد استفاده می‌کنند.

ایجاد یک مجموعه داده برای هوش مصنوعی بدون ساختار

ابتدا، یک مجموعه داده دوم در پروژه خود ایجاد کنید تا جداول شیء را با استفاده از bq CLI در چند منطقه US ذخیره کنید:

bq mk --location=US --project_id=$PROJECT_ID iceberg_object_ai

ایجاد یک اتصال خارجی

برای جستجوی داده‌های ذخیره شده در فضای ذخیره‌سازی ابری (هم جداول شیء و هم داده‌های بدون ساختار) از BigQuery، باید یک اتصال خارجی ایجاد کنید.

برای ایجاد یک اتصال Cloud Resource، دستور زیر را در Cloud Shell اجرا کنید:

bq mk --connection --project_id=$PROJECT_ID --location=US --connection_type=CLOUD_RESOURCE my-conn

شناسه حساب سرویس ایجاد شده برای اتصال خود را پیدا کنید:

CONNECTION_SA=$(bq show --format=json --project_id=$PROJECT_ID --connection $PROJECT_ID.us.my-conn | jq -r '.serviceAccountId // .cloudResource.serviceAccountId')

به حساب سرویس، نقش‌های Vertex AI User و Storage Object Viewer را اعطا کنید تا بتواند مدل‌های Gemini را فراخوانی کرده و داده‌های GCS را بخواند:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$CONNECTION_SA" \
  --role="roles/aiplatform.user"

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$CONNECTION_SA" \
  --role="roles/storage.objectViewer"

ایجاد یک جدول شیء

ما از اتصال خارجی my-conn که در بخش قبلی ایجاد کردیم برای دسترسی به داده‌های بدون ساختار استفاده خواهیم کرد. یک فایل پرس‌وجو ایجاد کنید و جدول اشیاء را با استفاده bq query ایجاد کنید:

cat <<'EOF' > create_object_table.sql
CREATE EXTERNAL TABLE `iceberg_object_ai.sample_images`
WITH CONNECTION `us.my-conn`
OPTIONS (
  object_metadata = 'SIMPLE',
  uris = ['gs://cloud-samples-data/vision/landmark/*']
);
EOF

bq query --use_legacy_sql=false < create_object_table.sql

استفاده از Gemini روی داده‌های شیءگرا

حالا با استفاده از Gemini یک کوئری اجرا کنید تا تصاویر را بدون دانلود کردن، ارزیابی کند!

با استفاده از SQL استاندارد از طریق bq query تصاویر را جستجو کنید:

cat <<EOF > query_images.sql
SELECT
  uri,
  image_analysis.description
FROM (
  SELECT
    uri,
    AI.GENERATE(
      (
        'Identify what is happening in the image.',
        ref
      ),
      connection_id => 'us.my-conn',
      endpoint => 'gemini-2.5-flash-lite',
      output_schema => 'event STRING, severity STRING, description STRING'
    ) AS image_analysis
  FROM
    iceberg_object_ai.sample_images
);
EOF

bq query --use_legacy_sql=false < query_images.sql

خروجی نمونه:

+----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                           uri                            |                                                                                                                                                                                                                             description                                                                                                                                                                                                                             |
+----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| gs://cloud-samples-data/vision/landmark/eiffel_tower.jpg | The Eiffel Tower stands tall against a cloudy sky, overlooking the Seine River in Paris. Boats are docked along the riverbank, and trees line the opposite shore, with bridges and buildings visible in the distance.                                                                                                                                                                                                                                               |
| gs://cloud-samples-data/vision/landmark/pofa.jpg         | A wide shot shows the Palace of Fine Arts, a monumental structure in San Francisco, California. The building features a large rotunda with a dome, surrounded by colonnades. In front of the rotunda is a lagoon. Several people are walking around the grounds. The sky is blue with a few scattered clouds.                                                                                                                                                       |
| gs://cloud-samples-data/vision/landmark/st_basils.jpeg   | A monument stands in front of Saint Basil's Cathedral in Moscow under a bright blue sky with scattered white clouds. The cathedral features distinctive onion domes in various colors and patterns, including red, blue and white stripes, green and beige stripes, and red and blue diamonds. A large green tree partially obscures the left side of the cathedral. People are visible in the foreground near the base of the monument and the cathedral entrance. |
+----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

بررسی مستقیم ObjectRefها: تحلیل احساسات

در حالی که جداول شیء (Object Tables) به طور خودکار ارجاعات فایل را مدیریت می‌کنند، می‌توانید با استفاده از BigQuery Object References مستقیماً با این اشیاء تعامل داشته باشید تا تجزیه و تحلیل درجا (on-the-fly) را روی فایل‌های منفرد اجرا کنید.

برای مثال، می‌توانید از یک فایل متنی کوچک ذخیره شده در سطل GCS خودتان (با استفاده از متغیر $DEPS_BUCKET که قبلاً ایجاد شده است) استفاده کنید و آن را با استفاده از OBJ.MAKE_REF با bq query تجزیه و تحلیل کنید.

ابتدا یک فایل متنی کوچک ایجاد کنید و آن را در باکت خود آپلود کنید:

cat <<'EOF' > review.txt
This product is fantastic! It exceeded my expectations. The quality is top-notch. I highly recommend it to everyone!
EOF

gcloud storage cp review.txt gs://${DEPS_BUCKET}/review.txt

اکنون با استفاده از OBJ.MAKE_REF در SQL استاندارد، فایل را کوئری کنید:

cat <<EOF > sentiment_analysis.sql
SELECT
  AI.GENERATE(
    (
      'Analyze the sentiment of this text file. Is it positive, negative, or neutral? Explain why.',
      OBJ.MAKE_REF('gs://${DEPS_BUCKET}/review.txt', 'us.my-conn')
    ),
    connection_id => 'us.my-conn',
    endpoint => 'gemini-2.5-flash-lite'
  ).result AS ml_generate_text_result;
EOF

bq query --use_legacy_sql=false < sentiment_analysis.sql

خروجی نمونه:

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                 ml_generate_text_result                                                                                  |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| This text file has a **strongly positive** sentiment.                                                                                                                                    |
|                                                                                                                                                                                          |
| Here's why:                                                                                                                                                                              |
|                                                                                                                                                                                          |
| *   **Positive Keywords:** The text is filled with unequivocally positive words and phrases:                                                                                             |
|     *   "fantastic"                                                                                                                                                                      |
|     *   "exceeded my expectations"                                                                                                                                                       |
|     *   "top-notch"                                                                                                                                                                      |
|     *   "highly recommend"                                                                                                                                                               |
|                                                                                                                                                                                          |
| *   **Enthusiastic Language:** The use of exclamation marks ("!") further amplifies the positive tone, indicating excitement and strong approval.                                        |
|                                                                                                                                                                                          |
| *   **Lack of Negative or Neutral Elements:** There are no words, phrases, or implications that suggest any dissatisfaction, criticism, or even indifference.                            |
|                                                                                                                                                                                          |
| In summary, the author's language is enthusiastic and uses multiple strong positive descriptors, leaving no room for doubt that their opinion of the product is overwhelmingly positive. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

۸. تمیز کردن

برای جلوگیری از هزینه‌های مداوم برای حساب Google Cloud خود، منابع ایجاد شده در طول این codelab را حذف کنید.

حذف مجموعه داده و اتصال

برای حذف مجموعه داده‌ها و اتصال خود، دستور زیر را در Cloud Shell اجرا کنید:

bq rm -r -f --location=$REGION iceberg_ai
bq rm -r -f --location=US iceberg_object_ai
bq rm --connection $PROJECT_ID.US.my-conn

حذف سطل‌های GCS و فایل‌های محلی

سطل‌های GCS و فایل‌های محلی را پاک کنید:

# Delete GCS buckets
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud storage rm -r gs://dataproc-temp-${REGION}-${PROJECT_NUMBER}-*
gcloud storage rm -r gs://dataproc-staging-${REGION}-${PROJECT_NUMBER}-*
gcloud storage rm -r gs://${DEPS_BUCKET}

# Delete local files
rm -f train_model.sql predict_fare.sql create_object_table.sql query_images.sql sentiment_analysis.sql test.py query.py history.py timetravel.py review.txt

همچنین اگر پروژه را فقط برای این آزمایشگاه ایجاد کرده‌اید، می‌توانید کل آن را حذف کنید.

۹. تبریک

تبریک! شما با موفقیت یک Unified Data Lakehouse با استفاده از Apache Iceberg، BigLake و BigQuery AI ساختید!

آنچه آموخته‌اید

  • نحوه اتصال و پرس و جو از کاتالوگ‌های عمومی REST آپاچی آیسبرگ .
  • استفاده از سفر در زمان در Iceberg برای بررسی نسخه‌های مجموعه داده‌ها.
  • آموزش مدل‌های BigQuery ML روی داده‌های ساختاریافته.
  • اتصال داده‌های بدون ساختار (تصاویر) با استفاده از جداول شیء و ObjectRef.
  • استفاده مستقیم از Gemini در BigQuery SQL برای تجزیه و تحلیل تصاویر.

اسناد مرجع