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.
Arsitektur
Tabel Iceberg menghadirkan kemudahan pengelolaan resource BigQuery ke tabel yang berada di bucket cloud Anda sendiri. Tabel Iceberg memungkinkan Anda menggunakan BigQuery di tabel ini tanpa memindahkan data dari bucket yang Anda kontrol.
Diagram berikut menunjukkan arsitektur tabel terkelola di tingkat tinggi:
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 | Akibat | 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. |
Penagihan
Fitur berikut dikenai biaya 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).
- Tagihan 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 membuat tabel Iceberg:
-
BigQuery Data Owner (
roles/bigquery.dataOwner
) di project Anda -
BigQuery Connection Admin (
roles/bigquery.connectionAdmin
) di project Anda
-
BigQuery Data Owner (
-
Untuk membuat kueri tabel Iceberg:
-
BigQuery Data Viewer (
roles/bigquery.dataViewer
) di project Anda -
Pengguna BigQuery (
roles/bigquery.user
) di project Anda
-
BigQuery Data Viewer (
-
Agar akun layanan koneksi dapat membaca dan menulis data di Cloud Storage:
-
Storage Object Admin (
roles/storage.objectAdmin
) di bucket -
Storage Legacy Bucket Reader (
roles/storage.legacyBucketReader
) di bucket
-
Storage Object Admin (
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 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
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
dariload_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
dariload_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:
Ekspor metadata ke dalam format Iceberg dengan pernyataan SQL
EXPORT TABLE METADATA
.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 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 penggunaan 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:
- Tabel Iceberg tidak mendukung
operasi penggantian nama atau
pernyataan
ALTER TABLE RENAME TO
. - Tabel Iceberg tidak mendukung
salinan tabel atau
pernyataan
CREATE TABLE COPY
. - Tabel Iceberg tidak mendukung
clone tabel atau
pernyataan
CREATE TABLE CLONE
. - Tabel Iceberg tidak mendukung
snapshot tabel atau
pernyataan
CREATE SNAPSHOT TABLE
. - Tabel Iceberg tidak mendukung skema tabel berikut:
- Skema kosong
- Skema dengan jenis data
INTERVAL
,JSON
,RANGE
, atauGEOGRAPHY
. - Skema dengan pengurutan kolom.
- Skema dengan ekspresi nilai default.
EXPORT METADATA
tidak mendukung tabel yang berisi jenis dataBIGNUMERIC
atauNUMERIC
dengan presisi lebih besar dari 38 tempat.- Tabel Iceberg tidak mendukung kasus evolusi skema berikut:
- Pemaksaan jenis
NUMERIC
keFLOAT
- Pemaksaan jenis
INT
keFLOAT
- Menambahkan kolom bertingkat baru ke kolom
RECORD
yang sudah ada menggunakan pernyataan DDL SQL
- Pemaksaan jenis
- Tabel Iceberg menampilkan ukuran penyimpanan 0 byte saat dikueri oleh konsol atau API.
- Tabel Iceberg tidak mendukung tampilan terwujud.
- Tabel Iceberg tidak mendukung transaksi multi-pernyataan.
- Tabel Iceberg tidak mendukung update pengambilan data perubahan (CDC).
- Saat melakukan streaming data ke tabel Iceberg menggunakan BigQuery Storage Write API, Anda harus menonaktifkan cache kueri terlebih dahulu.
- Tabel Iceberg tidak mendukung pemulihan dari bencana terkelola
- Tabel Iceberg tidak mendukung partisi. Pertimbangkan pengelompokan sebagai alternatif.
- Tabel Iceberg tidak mendukung keamanan tingkat baris.
- Tabel gunung es tidak mendukung time travel.
- Tabel Iceberg tidak mendukung periode aman.
- Tabel Iceberg tidak mendukung tugas ekstrak.
- Tampilan
INFORMATION_SCHEMA.TABLE_STORAGE
tidak menyertakan tabel Iceberg. - Tabel Iceberg tidak didukung sebagai tujuan hasil kueri.
CREATE OR REPLACE
tidak mendukung penggantian tabel standar dengan tabel Iceberg, atau tabel Iceberg dengan tabel standar.- Pemuatan batch dan
pernyataan
LOAD DATA
hanya mendukung penambahan data ke tabel Iceberg yang ada. - Pemuatan batch dan
pernyataan
LOAD DATA
tidak mendukung pembaruan skema. TRUNCATE TABLE
tidak mendukung tabel Iceberg. Ada dua alternatif:CREATE OR REPLACE TABLE
, menggunakan opsi pembuatan tabel yang sama.DELETE FROM
tableWHERE
true
- Fungsi bernilai tabel (TVF)
APPENDS
tidak mendukung tabel Iceberg. - Ekspor Iceberg di Apache Spark tidak berisi data yang baru-baru ini di-streaming dalam penyimpanan yang dioptimalkan untuk tulis.
- Pemuatan cepat tidak mendukung file dengan nama kolom fleksibel.