1. Pengantar
Dalam codelab ini, Anda akan mempelajari kemampuan Unified Data Lakehouse di Google Cloud. Anda akan berinteraksi dengan set data publik yang disajikan melalui Katalog REST Apache Iceberg di BigLake, lalu menerapkan kemampuan AI Google Cloud ke data terstruktur dan tidak terstruktur.
Anda akan membuat kueri set data NYC Taxi klasik menggunakan Apache Iceberg, mempelajari Perjalanan Waktu untuk mengaudit perubahan data, lalu menggunakan BigQuery ML dan Gemini untuk menjalankan model AI pada data Anda.
Yang akan Anda lakukan
- Gunakan Google Cloud Serverless untuk Apache Spark guna membuat kueri set data publik Apache Iceberg yang dihosting di BigLake.
- Membuat kueri data terstruktur dalam format Apache Iceberg.
- Mendemonstrasikan Time Travel di Apache Iceberg.
- Gunakan BigQuery ML untuk melatih model prediktif pada data terstruktur.
- Buat Tabel Objek BigLake (Data tidak terstruktur) dan gunakan Gemini untuk menganalisis gambar.
Yang Anda butuhkan
- Browser web seperti Chrome.
- Project Google Cloud yang mengaktifkan penagihan.
Perkiraan Biaya dan Durasi
- Waktu penyelesaian: ~45 menit.
- Estimasi Biaya: < $2,00. Kami menggunakan set data publik dan kueri serverless untuk menjaga biaya tetap rendah.
2. Penyiapan dan Persyaratan
Pada langkah ini, Anda akan menyiapkan lingkungan dan mengaktifkan API yang diperlukan.
Mulai Cloud Shell
Anda akan menjalankan sebagian besar perintah dari Google Cloud Shell.
- Klik Activate Cloud Shell di bagian atas konsol Google Cloud.
- Verifikasi autentikasi:
gcloud auth list - Konfirmasi project Anda:
gcloud config get project - Jika project belum ditetapkan, tetapkan menggunakan project ID Anda:
gcloud config set project <YOUR_PROJECT_ID>
Mengaktifkan API
Jalankan perintah berikut untuk mengaktifkan API yang diperlukan untuk BigQuery, Cloud Resource Manager, dan Vertex AI:
gcloud services enable \
bigquery.googleapis.com \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com
Mengonfigurasi Lingkungan dan Membuat Bucket Dependensi
- Tetapkan variabel lingkungan di terminal Anda:
export PROJECT_ID=$(gcloud config get project) export REGION=us-central1 export DEPS_BUCKET=$PROJECT_ID-deps-bucket - Buat bucket Cloud Storage dependensi. Skrip PySpark diupload di sini pada saat pengiriman tugas:
gcloud storage buckets create gs://$DEPS_BUCKET --location=$REGION
3. Menghubungkan ke Katalog Publik Apache Iceberg
Pada langkah ini, Anda akan terhubung ke Katalog Apache Iceberg aktif tingkat produksi yang dihosting di BigLake Google Cloud.
Menjalankan Spark SQL dengan CLI Batch Serverless for Apache Spark
Kita akan menggunakan Google Cloud Serverless untuk Apache Spark guna menjalankan tugas PySpark tanpa perlu mengelola infrastruktur. Kita akan mengonfigurasinya agar mengarah ke Katalog REST BigLake publik.
- Tentukan properti BigLake REST Catalog agar tidak perlu mengulanginya.Konfigurasi ini memberi tahu Spark:
- Untuk menggunakan library
iceberg-spark-runttimedaniceberg-gcp-bundle. - Untuk mengonfigurasi katalog bernama
my_catalogmenggunakan endpoint BigLake REST Catalog. - Untuk menggunakan Google Cloud Storage (GCS) untuk membaca file data, bukan sistem file lokal default.
- Untuk menetapkan katalog
my_catalogini sebagai default untuk sesi kita. - Untuk menggunakan kredensial yang disediakan untuk meningkatkan keamanan dan menyederhanakan akses data.
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" - Untuk menggunakan library
- Buat file kueri pengujian sederhana:
cat <<EOF > test.py from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() spark.sql("SHOW TABLES IN public_data").show() EOF - Kirimkan tugas batch:
Anda akan melihat output yang mirip dengan berikut ini: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| +-----------+----------------+-----------+
4. Mengkueri Data Iceberg Terstruktur
Setelah terhubung, Anda memiliki akses SQL penuh ke set data. Kita akan membuat kueri set data NYC Taxi yang dimodelkan sebagai tabel Iceberg.
Menjalankan kueri agregasi standar
Buat file bernama 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
Kemudian, kirimkan menggunakan Serverless for 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
Anda akan melihat output yang serupa dengan ini di konsol:
+---------------+---------+--------+------------+ |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| +---------------+---------+--------+------------+
Mengapa menggunakan Apache Iceberg di sini?
- Penyusutan Partisi: Kueri memfilter
data_file_year = 2021. Iceberg memungkinkan mesin melewati pemindaian data dari tahun lain sepenuhnya. - Fleksibilitas Mesin: Anda dapat menjalankan ini di Spark, Trino, atau BigQuery tanpa menyalin data.
5. Time Travel di Apache Iceberg
Salah satu fitur Iceberg yang paling canggih adalah Time Travel. Dengan fitur ini, Anda dapat membuat kueri data sebagaimana adanya pada versi atau snapshot sebelumnya.
Melihat Histori Tabel
Buat file bernama 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
Lalu kirimkan:
gcloud dataproc batches submit pyspark \
--project=$PROJECT_ID \
--region=$REGION \
--version=2.3 \
--properties="$METASTORE_PROPERTIES" \
--deps-bucket=gs://$DEPS_BUCKET \
history.py
Anda akan melihat output yang mirip dengan berikut ini di konsol:
+--------------------+-------------------+-------------------+-------------------+ | 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| +--------------------+-------------------+-------------------+-------------------+
Anda akan melihat baris yang merepresentasikan berbagai ID snapshot dan kapan snapshot tersebut di-commit.
Membandingkan jumlah baris saat ini vs. sebelumnya
Buat file bernama 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
Lalu kirimkan:
gcloud dataproc batches submit pyspark \
--project=$PROJECT_ID \
--region=$REGION \
--version=2.3 \
--properties="$METASTORE_PROPERTIES" \
--deps-bucket=gs://$DEPS_BUCKET \
timetravel.py
Anda akan melihat output yang mirip dengan berikut ini di konsol:
+-------------+----------+ | version| count| +-------------+----------+ |Current State|1293069366| | Past State| 72878594| +-------------+----------+
Hal ini memastikan Anda dapat mengaudit perubahan data dari waktu ke waktu.
6. AI Terstruktur dengan BigQuery ML
Setelah Anda menjelajahi data Iceberg, mari kita gunakan kemampuan AI BigQuery. Karena katalog Iceberg publik bersifat hanya baca, kita dapat menggunakan BigQuery untuk melatih model di ruang kerja dengan membaca dari tabel publik.
Membuat set data lokal
Pertama, buat set data di project Anda untuk menyimpan model AI menggunakan bq CLI:
bq mk --location=$REGION --project_id=$PROJECT_ID iceberg_ai
Melatih Model Regresi Linear
Sekarang Anda akan melatih model Regresi Linear menggunakan tabel Iceberg BigLake publik.
Buat file kueri dan latih model menggunakan 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
Memprediksi menggunakan Model
Setelah model dilatih, Anda dapat menggunakannya untuk memprediksi jumlah tarif perjalanan baru menggunakan ML.PREDICT.
Buat file kueri dan jalankan prediksi menggunakan 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
Anda akan melihat output yang mirip dengan berikut ini:
+-----------------------+-----------------+---------------+ | predicted_fare_amount | passenger_count | trip_distance | +-----------------------+-----------------+---------------+ | 14.12252095150709 | 2 | 5.0 | +-----------------------+-----------------+---------------+
7. AI tidak terstruktur dengan BigLake
Data bukan hanya baris dan kolom. Lakehouse Data Terpadu juga menangani data tidak terstruktur (gambar, PDF). Mari kita gunakan Tabel Objek dan Referensi Objek untuk membuat kueri data tidak terstruktur.
Tabel objek adalah tabel eksternal hanya baca di BigQuery yang mencantumkan objek di jalur Cloud Storage. Setiap baris mewakili file, dengan kolom untuk metadata seperti uri, size, dan kolom ref khusus yang berisi ObjectRef.
Referensi objek (ObjectRef) mengarah ke data sebenarnya dari satu file. Fungsi BigQuery ML modern (seperti AI.GENERATE atau AI.AGG) menggunakan ObjectRef untuk membaca konten file (gambar, audio, atau teks) untuk dianalisis tanpa memuat byte ke dalam tabel standar.
Membuat Set Data untuk AI Tidak Terstruktur
Pertama, buat set data kedua di project Anda untuk menyimpan Tabel Objek menggunakan CLI bq di multi-region US:
bq mk --location=US --project_id=$PROJECT_ID iceberg_object_ai
Membuat Koneksi Eksternal
Untuk membuat kueri data yang disimpan di Cloud Storage (baik Tabel Objek maupun data tidak terstruktur) dari BigQuery, Anda perlu membuat Koneksi eksternal.
Jalankan perintah berikut di Cloud Shell untuk membuat koneksi Resource Cloud:
bq mk --connection --project_id=$PROJECT_ID --location=US --connection_type=CLOUD_RESOURCE my-conn
Temukan ID akun layanan yang dibuat untuk koneksi Anda:
CONNECTION_SA=$(bq show --format=json --project_id=$PROJECT_ID --connection $PROJECT_ID.us.my-conn | jq -r '.serviceAccountId // .cloudResource.serviceAccountId')
Berikan peran Vertex AI User dan Storage Object Viewer kepada Akun Layanan agar dapat memanggil model Gemini dan membaca data 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"
Membuat Tabel Objek
Kita akan menggunakan koneksi eksternal my-conn yang dibuat di bagian sebelumnya untuk mengakses data tidak terstruktur. Buat file kueri dan buat Tabel Objek menggunakan 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
Menggunakan Gemini pada Data Objek
Sekarang jalankan kueri menggunakan Gemini untuk mengevaluasi gambar tanpa mendownloadnya.
Buat kueri gambar menggunakan SQL standar melalui 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
Contoh output:
+----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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. |
+----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Mengeksplorasi ObjectRef Secara Langsung: Analisis Sentimen
Meskipun Tabel Objek mengelola referensi file secara otomatis, Anda dapat berinteraksi dengan objek ini secara langsung menggunakan Referensi Objek BigQuery untuk menjalankan analisis langsung pada file tunggal.
Misalnya, Anda dapat menggunakan file teks kecil yang disimpan di bucket GCS Anda sendiri (menggunakan variabel $DEPS_BUCKET yang dibuat sebelumnya) dan menganalisisnya menggunakan OBJ.MAKE_REF dengan bq query.
Pertama, buat file teks kecil dan upload ke bucket Anda:
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
Sekarang, kueri file menggunakan OBJ.MAKE_REF dalam SQL standar:
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
Contoh output:
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
8. Pembersihan
Untuk menghindari biaya berkelanjutan pada akun Google Cloud Anda, hapus resource yang dibuat selama codelab ini.
Menghapus Set Data dan Koneksi
Jalankan perintah berikut di Cloud Shell untuk menghapus set data dan koneksi Anda:
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
Menghapus bucket GCS dan file lokal
Bersihkan bucket GCS dan file lokal:
# 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
Anda juga dapat menghapus seluruh project jika Anda membuatnya hanya untuk lab ini.
9. Selamat
Selamat! Anda telah berhasil membangun Lakehouse Data Terpadu menggunakan Apache Iceberg, BigLake, dan AI BigQuery.
Yang telah Anda pelajari
- Cara menghubungkan dan membuat kueri Katalog REST Apache Iceberg Publik.
- Menggunakan Perjalanan Waktu di Iceberg untuk mengaudit versi set data.
- Melatih model BigQuery ML pada data terstruktur.
- Menghubungkan data tidak terstruktur (gambar) menggunakan Tabel Objek & ObjectRef.
- Menggunakan Gemini langsung di BigQuery SQL untuk menganalisis gambar.