Tabel BigQuery untuk Apache Iceberg

Untuk mendapatkan dukungan selama pratinjau, kirim email ke bigquery-tables-for-apache-iceberg-help@google.com.

Tabel BigQuery untuk Apache Iceberg, (selanjutnya, tabel Iceberg) menyediakan dasar untuk membuat lakehouse berformat terbuka di Google Cloud. Tabel Iceberg menawarkan pengalaman terkelola sepenuhnya yang sama seperti tabel BigQuery, tetapi menyimpan data di bucket penyimpanan milik pelanggan menggunakan Parquet agar dapat dioperasikan secara interoperabilitas dengan format tabel terbuka Iceberg.

Tabel BigQuery untuk Apache Iceberg berbeda dengan tabel eksternal BigLake untuk Apache Iceberg karena hanya tabel BigQuery untuk Apache Iceberg yang dapat diubah langsung dalam BigQuery. Tabel eksternal BigLake untuk Apache Iceberg adalah tabel hanya baca yang dihasilkan dari mesin kueri lain, seperti Apache Spark, dan hanya dapat dikueri menggunakan BigQuery.

Tabel Iceberg mendukung fitur berikut:

  • Mutasi tabel menggunakan bahasa pengolahan data (DML) GoogleSQL.
  • Streaming throughput tinggi dan batch terpadu menggunakan Storage Write API melalui konektor BigLake seperti Spark, Dataflow, dan mesin lainnya.
  • Evolusi skema, yang memungkinkan Anda menambahkan, menghapus, dan mengganti nama kolom sesuai dengan kebutuhan Anda. Fitur ini juga memungkinkan Anda mengubah jenis data kolom yang ada dan mode kolom. Untuk informasi selengkapnya, lihat aturan konversi jenis.
  • Pengoptimalan penyimpanan otomatis, termasuk ukuran file adaptif, pengelompokan otomatis, pembersihan sampah, dan pengoptimalan metadata.
  • Keamanan tingkat kolom dan penyamaran data.

Berikut ini perbandingan tabel BigQuery Iceberg dengan jenis tabel serupa lainnya di BigQuery:

Tabel BigQuery standar Tabel eksternal BigLake Tabel eksternal BigLake untuk Apache Iceberg (alias tabel BigLake Iceberg) Tabel Iceberg metastore BigQuery (pratinjau) Tabel BigQuery untuk Apache Iceberg (alias tabel yang dikelola Iceberg/ tabel BigQuery Iceberg) (pratinjau)
Fitur utama Pengalaman terkelola sepenuhnya Dikelola (kontrol akses yang mendetail) dan berfungsi di seluruh mesin open source dan BigQuery Fitur tabel eksternal BigLake + konsistensi data, update skema. Tidak dapat dibuat dari Spark atau mesin terbuka lainnya. Fitur tabel BigLake Iceberg + dapat diubah dari mesin eksternal. Tidak dapat dibuat dengan DDL atau alat command line bq. Fitur tabel BigLake Iceberg + overhead pengelolaan yang rendah dengan data dan metadata terbuka
Penyimpanan data Penyimpanan terkelola BigQuery Membuka data format yang dihosting di bucket yang dikelola pengguna
Model terbuka BigQuery Storage Read API (melalui konektor) Format file terbuka (Parquet) Library terbuka (Iceberg) Kompatibel dengan open source (snapshot metadata Iceberg)
Pemerintahan Tata kelola BigQuery terpadu
Penulisan (DML dan Streaming) Melalui konektor BigQuery, API, DML dengan throughput tinggi, CDC Hanya menulis melalui mesin eksternal Melalui konektor BigQuery, API, DML dengan throughput tinggi, CDC

Arsitektur

Tabel Iceberg menghadirkan kemudahan pengelolaan resource BigQuery ke tabel yang berada di bucket cloud Anda sendiri. Tabel Iceberg memungkinkan Anda menggunakan BigQuery pada tabel ini tanpa memindahkan data dari bucket yang Anda kontrol.

Diagram berikut menunjukkan arsitektur tabel terkelola di tingkat tinggi: Diagram arsitektur BigQuery untuk tabel Iceberg.

Pengelolaan tabel ini memiliki implikasi berikut pada bucket Anda:

  • BigQuery membuat file data baru di bucket sebagai respons terhadap permintaan tulis dan pengoptimalan penyimpanan latar belakang, seperti pernyataan DML dan streaming.
  • Saat Anda menghapus tabel terkelola di BigQuery, BigQuery tidak akan menghapus file data terkait. Anda harus mengonfirmasi penghapusan dengan menghapus file dan metadata tabel yang diekspor dari bucket secara manual.
  • Tabel Iceberg tidak dikenai biaya penyimpanan BigQuery. Untuk mengetahui informasi selengkapnya, lihat Penagihan.

Membuat tabel Iceberg mirip dengan membuat tabel BigQuery. Karena menyimpan data dalam format terbuka di Cloud Storage, Cloud Storage memiliki lebih banyak opsi untuk hal berikut:

  • Tentukan koneksi resource Cloud dengan WITH CONNECTION untuk mengonfigurasi kredensial koneksi agar BigLake dapat mengakses Cloud Storage.
  • Menentukan format file penyimpanan data dengan file_format. PARQUET didukung di Pratinjau.
  • Menentukan format tabel metadata open source dengan table_format. ICEBERG didukung di Pratinjau.

Praktik terbaik

Mengubah atau menambahkan file secara langsung ke bucket di luar BigQuery dapat menyebabkan hilangnya data atau error yang tidak dapat dipulihkan. Tabel berikut menjelaskan kemungkinan skenario:

Operasi Konsekuensi Pencegahan
Tambahkan file baru ke bucket di luar BigQuery. Kehilangan data: File atau objek baru yang ditambahkan di luar BigQuery tidak dilacak oleh BigQuery. File yang tidak dilacak akan dihapus oleh proses pembersihan sampah latar belakang. Menambahkan data secara eksklusif melalui BigQuery. Hal ini memungkinkan BigQuery melacak file dan mencegahnya dihapus oleh garbage collection.
Untuk mencegah penambahan dan kehilangan data yang tidak disengaja, sebaiknya batasi izin tulis alat eksternal di bucket yang berisi tabel Iceberg.
Buat tabel Iceberg baru dalam awalan yang tidak kosong. Kehilangan data: Data yang ada tidak dilacak oleh BigQuery, sehingga file ini dianggap tidak dilacak, dan dihapus oleh proses pembersihan sampah latar belakang. Hanya membuat tabel Iceberg baru dalam awalan kosong.
Mengubah atau mengganti file data tabel Iceberg. Hilangnya data: Pada perubahan atau penggantian eksternal, tabel gagal dalam pemeriksaan konsistensi dan menjadi tidak dapat dibaca. Kueri terhadap tabel gagal.
Tidak ada cara mandiri untuk memulihkan dari tahap ini. Hubungi dukungan untuk mendapatkan bantuan pemulihan data.
Mengubah data secara eksklusif melalui BigQuery. Hal ini memungkinkan BigQuery melacak file dan mencegahnya dihapus oleh garbage collection.
Untuk mencegah penambahan dan kehilangan data yang tidak disengaja, sebaiknya batasi izin tulis alat eksternal di bucket yang berisi tabel Iceberg.
Buat dua tabel BigQuery untuk Apache Iceberg di URI yang sama atau tumpang-tindih. Kehilangan data: BigQuery tidak menjembatani instance URI yang identik dari tabel Iceberg. Proses pembersihan sampah latar belakang untuk setiap tabel akan menganggap file tabel yang berlawanan sebagai tidak dilacak, dan menghapusnya, sehingga menyebabkan hilangnya data. Gunakan URI unik untuk setiap tabel Iceberg.

Pertimbangan lokasi

Anda dapat meningkatkan performa menggunakan bucket region tunggal atau region ganda Cloud Storage, bukan bucket multi-region.

Penagihan

Fitur berikut ditagih menggunakan harga yang dipublikasikan yang ada:

  • Harga Cloud Storage untuk semua data yang disimpan di bucket Cloud Storage, pemrosesan data yang dilakukan oleh Cloud Storage, dan penggunaan jaringan untuk jumlah data yang dibaca dari bucket Anda.
  • Harga komputasi BigQuery untuk kueri, DML, dan pengoptimalan penyimpanan latar belakang (termasuk pengelompokan, penggabungan, dan pembersihan sampah).
    • Biaya yang menggunakan reservasi (slot) mengikuti harga slot yang ada.
    • Tagihan yang menggunakan unit pengelolaan inventaris (SKU) on-demand mengikuti harga on-demand yang ada. Untuk informasi selengkapnya, lihat Biaya BigLake.
  • Komputasi Pemuatan batch dan Ekstrak dikenai biaya menggunakan SKU on demand atau reservasi (slot).
  • Harga Storage Read API untuk membaca dari Spark melalui Read API.
  • Harga Storage Write API untuk streaming.

Alur kerja tabel Iceberg

Bagian berikut menjelaskan cara membuat, memuat, mengelola, dan membuat kueri tabel terkelola.

Sebelum memulai

Sebelum membuat dan menggunakan tabel Iceberg, pastikan Anda telah menyiapkan koneksi resource cloud ke bucket penyimpanan. Koneksi Anda memerlukan izin tulis di bucket penyimpanan, seperti yang ditentukan di bagian Peran yang diperlukan berikut.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan agar BigQuery dapat mengelola tabel di project, minta administrator untuk memberi Anda peran IAM berikut:

Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran bawaan ini berisi izin yang diperlukan untuk mengizinkan BigQuery mengelola tabel dalam project Anda. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan agar BigQuery dapat mengelola tabel di project Anda:

  • bigquery.connections.delegate di project Anda
  • bigquery.jobs.create di project Anda
  • bigquery.readsessions.create di project Anda
  • bigquery.tables.create di project Anda
  • bigquery.tables.get di project Anda
  • bigquery.tables.getData di project Anda
  • storage.buckets.get di bucket Anda
  • storage.objects.create di bucket Anda
  • storage.objects.delete di bucket Anda
  • storage.objects.get di bucket Anda
  • storage.objects.list di bucket Anda

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Membuat tabel Iceberg

Untuk membuat tabel Iceberg, pilih salah satu metode berikut:

SQL

CREATE TABLE [PROJECT_NAME.]DATASET_NAME.TABLE_NAME (
COLUMN DATA_TYPE[, ...]
)
CLUSTER BY CLUSTER_COLUMN_LIST
WITH CONNECTION CONNECTION_NAME
OPTIONS (
file_format = 'PARQUET',
table_format = 'ICEBERG',
storage_uri = 'STORAGE_URI');

Ganti kode berikut:

  • PROJECT_NAME: project yang berisi set data. Jika tidak ditentukan, perintah akan mengasumsikan project default.
  • DATASET_NAME: set data yang sudah ada.
  • TABLE_NAME: nama tabel yang Anda buat.
  • DATA_TYPE: jenis data informasi yang berisi dalam kolom.
  • CLUSTER_COLUMN_LIST: daftar yang dipisahkan koma yang berisi maksimal empat kolom. Kolom tersebut harus berupa kolom tingkat atas yang tidak berulang.
  • CONNECTION_NAME: nama koneksi. Contoh, myproject.us.myconnection.
  • STORAGE_URI: Cloud Storage URI yang sepenuhnya memenuhi syarat. Misalnya, gs://mybucket/table.

bq

bq --project_id=PROJECT_NAME mk \
    --file_format=PARQUET \
    --table_format=ICEBERG \
    --connection_id=CONNECTION_NAME \
    --storage_uri=STORAGE_URI \
    --schema=COLUMN_NAME:DATA_TYPE[, ...] \
    --clustering_fields=CLUSTER_COLUMN_LIST \
    MANAGED_TABLE_NAME

Ganti kode berikut:

  • PROJECT_NAME: project yang berisi set data. Jika tidak ditentukan, perintah akan mengasumsikan project default.
  • CONNECTION_NAME: nama koneksi. Contoh, myproject.us.myconnection.
  • STORAGE_URI: Cloud Storage URI yang sepenuhnya memenuhi syarat. Misalnya, gs://mybucket/table.
  • COLUMN_NAME: nama kolom.
  • DATA_TYPE: jenis data informasi yang terdapat dalam kolom.
  • CLUSTER_COLUMN_LIST: daftar yang dipisahkan koma yang berisi maksimal empat kolom. Kolom tersebut harus berupa kolom tingkat atas yang tidak berulang.
  • MANAGED_TABLE_NAME: nama tabel yang Anda buat.

API

Panggil metode tables.insert dengan resource tabel yang ditentukan, mirip dengan berikut:

{
"tableReference": {
  "tableId": "TABLE_NAME"
},
"biglakeConfiguration": {
  "connectionId": "CONNECTION_NAME",
  "fileFormat": "PARQUET",
  "tableFormat": "ICEBERG",
  "storageUri": "STORAGE_URI"
},
"schema": {
  "fields": [
    {
      "name": "COLUMN_NAME",
      "type": "DATA_TYPE"
    }
    [, ...]
  ]
}
}

Ganti kode berikut:

  • TABLE_NAME: nama tabel yang Anda buat.
  • CONNECTION_NAME: nama koneksi. Contoh, myproject.us.myconnection.
  • STORAGE_URI: Cloud Storage URI yang sepenuhnya memenuhi syarat. Karakter pengganti juga didukung. Contoh, gs://mybucket/table.
  • COLUMN_NAME: nama kolom.
  • DATA_TYPE: jenis data informasi yang terdapat dalam kolom.

Mengimpor data ke tabel Iceberg

Bagian berikut menjelaskan cara mengimpor data dari berbagai format tabel ke dalam tabel Iceberg.

Pemuatan cepat dari file Parquet

Opsi copy_files_only memungkinkan Anda memuat data lebih cepat dengan menyalin file Parquet yang ada, bukan membaca konten dan menulis ulang konten sebagai file baru. Pemuatan cepat menggunakan lebih sedikit kapasitas komputasi dibandingkan dengan pemuatan file reguler. File Parquet harus kompatibel dengan spesifikasi Apache Iceberg dan memiliki statistik kolom lengkap. Pemuatan cepat tidak mendeteksi nilai yang tidak valid (seperti stempel waktu di luar rentang) dalam file karena file tersebut tidak dibaca dan diproses ulang. Untuk informasi selengkapnya tentang memuat file Parquet, lihat Memuat data Parquet ke tabel baru.

Untuk memuat file Parquet datar dengan cepat ke dalam tabel Iceberg yang ada, gunakan perintah bq load:

bq load \
    --copy_files_only \
    --source_format=PARQUET \
    DATASET_NAME.TABLE_NAME \
    PATH_TO_SOURCE

Ganti kode berikut:

  • DATASET_NAME: set data yang berisi tabel Iceberg Anda.
  • TABLE_NAME: nama tabel Iceberg tempat Anda memuat data.
  • PATH_TO_SOURCE: Cloud Storage URI yang sepenuhnya memenuhi syarat atau daftar URI yang dipisahkan koma. Karakter pengganti juga didukung. Contoh, gs://mybucket/mydata*.parquet.

Memuat data standar dari file datar

Tabel Iceberg menggunakan tugas pemuatan BigQuery untuk memuat file eksternal ke dalam tabel Iceberg. Jika Anda sudah memiliki tabel Iceberg, ikuti panduan CLI bq load atau panduan SQL LOAD untuk memuat data eksternal. Setelah memuat data, file Parquet baru akan ditulis ke folder STORAGE_URI/data.

Jika petunjuk sebelumnya digunakan tanpa tabel Iceberg yang ada, tabel BigQuery akan dibuat.

Lihat contoh berikut untuk mengetahui contoh pemuatan batch khusus alat ke dalam tabel terkelola:

SQL

LOAD DATA INTO MANAGED_TABLE_NAME
FROM FILES (
uris=['STORAGE_URI'],
format='FILE_FORMAT');

Ganti kode berikut:

  • MANAGED_TABLE_NAME: nama tabel Iceberg yang ada.
  • STORAGE_URI: Cloud Storage URI yang sepenuhnya memenuhi syarat atau daftar URI yang dipisahkan koma. Karakter pengganti juga didukung. Contoh, gs://mybucket/table.
  • FILE_FORMAT: format tabel sumber. Untuk format yang didukung, lihat baris format dari load_option_list.

bq

bq load \
  --source_format=FILE_FORMAT \
  MANAGED_TABLE \
  STORAGE_URI

Ganti kode berikut:

  • FILE_FORMAT: format tabel sumber. Untuk format yang didukung, lihat baris format dari load_option_list.
  • MANAGED_TABLE_NAME: nama tabel Iceberg yang ada.
  • STORAGE_URI: Cloud Storage URI yang sepenuhnya memenuhi syarat atau daftar URI yang dipisahkan koma. Karakter pengganti juga didukung. Contoh, gs://mybucket/table.

Pemuatan standar dari file yang dipartisi Hive

Anda dapat memuat file yang dipartisi Hive ke dalam tabel Iceberg menggunakan tugas pemuatan BigQuery standar. Untuk informasi selengkapnya, lihat Memuat data yang dipartisi secara eksternal.

Memuat data streaming dari Pub/Sub

Anda dapat memuat data streaming ke tabel Iceberg menggunakan langganan BigQuery Pub/Sub.

Mengekspor data dari tabel Iceberg

Bagian berikut menjelaskan cara mengekspor data dari tabel Iceberg ke berbagai format tabel.

Mengekspor data ke dalam format datar

Untuk mengekspor tabel Iceberg ke dalam format datar, gunakan pernyataan EXPORT DATA dan pilih format tujuan. Untuk mengetahui informasi selengkapnya, lihat Mengekspor data.

Membuat snapshot metadata tabel Iceberg

Untuk membuat snapshot metadata tabel Iceberg, ikuti langkah-langkah berikut:

  1. Ekspor metadata ke dalam format Iceberg dengan pernyataan SQL EXPORT TABLE METADATA.

  2. Opsional: Jadwalkan pembaruan snapshot metadata Iceberg. Untuk memuat ulang snapshot metadata Iceberg berdasarkan interval waktu yang ditetapkan, gunakan kueri terjadwal.

Contoh berikut membuat kueri terjadwal bernama My Scheduled Snapshot Refresh Query menggunakan pernyataan DDL EXPORT TABLE METADATA FROM mydataset.test. Set data tujuan adalah mydataset. Pernyataan DDL berjalan setiap 24 jam.

bq query \
    --use_legacy_sql=false \
    --destination_dataset=mydataset
    --display_name='My Scheduled Snapshot Refresh Query' \
    --schedule='every 24 hours' \
    'EXPORT TABLE METADATA FROM mydataset.test'

Melihat snapshot metadata tabel Iceberg

Setelah memuat ulang snapshot metadata tabel Iceberg, Anda dapat menemukan snapshot di URI Cloud Storage tempat tabel Iceberg awalnya dibuat. Folder /data berisi shard data file Parquet, dan folder /metadata berisi snapshot metadata tabel Iceberg.

SELECT
  table_name,
  REGEXP_EXTRACT(ddl, r"storage_uri\s*=\s*\"([^\"]+)\"") AS storage_uri
FROM
  `mydataset`.INFORMATION_SCHEMA.TABLES;

Perhatikan bahwa mydataset dan table_name adalah placeholder untuk set data dan tabel yang sebenarnya.

Membaca tabel Iceberg dengan Apache Spark

Siapkan dan baca data tabel di Apache Spark dengan HadoopCatalog.

Contoh berikut menyiapkan lingkungan Anda untuk menggunakan Spark SQL dengan Apache Iceberg, lalu menjalankan kueri untuk mengambil data dari tabel Iceberg yang ditentukan.

spark-sql \
  --packages org.apache.iceberg:iceberg-spark-runtime-ICEBERG_VERSION_NUMBER \
  --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.CATALOG_NAME.type=hadoop \
  --conf spark.sql.catalog.CATALOG_NAME.warehouse='BUCKET_PATH' \

# Query the table
SELECT * FROM CATALOG_NAME.FOLDER_NAME;

Ganti kode berikut:

  • ICEBERG_VERSION_NUMBER: versi runtime Apache Spark Iceberg saat ini. Download versi terbaru dari Rilis Spark.
  • CATALOG_NAME: katalog untuk mereferensikan tabel Iceberg Anda.
  • BUCKET_PATH: jalur ke bucket yang berisi file tabel. Contoh, gs://mybucket/.
  • FOLDER_NAME: folder yang berisi file tabel. Contoh, myfolder.

Mengubah tabel Iceberg

Untuk mengubah tabel Iceberg, ikuti langkah-langkah yang ditampilkan di Mengubah skema tabel.

Harga

Harga tabel gunung es terdiri dari tiga komponen terpisah:

Penyimpanan

Tabel Iceberg menyimpan semua data di Cloud Storage. Anda akan dikenai biaya untuk semua data yang disimpan, termasuk data tabel historis. Pemrosesan data dan biaya transfer Cloud Storage juga dapat berlaku, sebagaimana berlaku. Tidak ada biaya penyimpanan khusus BigQuery. Untuk mengetahui informasi selengkapnya, lihat Harga Cloud Storage.

Pengoptimalan penyimpanan

Tabel Iceberg memerlukan operasi pengoptimalan penyimpanan, seperti penggabungan file dan pengelompokan ulang. Operasi pengoptimalan ini menggunakan slot bayar sesuai pemakaian edisi Enterprise, dan tidak menggunakan reservasi BACKGROUND yang ada.

Operasi ekspor data yang terjadi saat melakukan streaming melalui BigQuery Storage Write API disertakan dalam harga Storage Write API dan tidak dikenai biaya sebagai pemeliharaan latar belakang. Untuk mengetahui informasi selengkapnya, lihat Harga penyerapan data.

Penggunaan pengoptimalan penyimpanan dapat dilihat di tampilan INFORMATION_SCHEMA.JOBS.

Kueri dan tugas

Serupa dengan tabel BigQuery, Anda akan ditagih untuk kueri dan byte yang dibaca (per TiB) jika menggunakan harga BigQuery on-demand, atau penggunaan slot (per jam slot) jika menggunakan harga komputasi kapasitas BigQuery.

Harga BigQuery juga berlaku untuk BigQuery Storage Read API dan BigQuery Storage Write API.

Operasi pemuatan dan ekspor (seperti EXPORT METADATA) menggunakan slot bayar sesuai pemakaian edisi Enterprise. Hal ini berbeda dengan tabel BigQuery, yang tidak dikenai biaya untuk operasi ini. Jika pemesanan PIPELINE dengan slot Enterprise atau Enterprise Plus tersedia, operasi pemuatan dan ekspor sebaiknya menggunakan slot pemesanan ini.

Batasan

Tabel Iceberg memiliki batasan berikut: