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 mengetahui 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.

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 modifikasi 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 agar BigQuery dapat mengelola tabel di 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 project Anda
  • storage.objects.create di project Anda
  • storage.objects.delete di project Anda
  • storage.objects.get di project Anda
  • storage.objects.list di project 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.

Data pemuatan 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.

Membaca tabel Iceberg dengan metadata Iceberg

Untuk membaca data dari tabel Iceberg dalam format Iceberg, ikuti langkah-langkah berikut:

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

  2. 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' \
    
    # Queries the table
    spark-sql> 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.

Kueri dan tugas

Serupa dengan tabel BigQuery, Anda akan ditagih untuk kueri dan byte yang dibaca (per TiB) jika menggunakan harga on-demand BigQuery, 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: