Membuat tabel eksternal BigLake untuk Apache Iceberg
Tabel eksternal BigLake memungkinkan Anda mengakses tabel Apache Iceberg dengan kontrol akses yang lebih terperinci dalam format hanya baca. Kemampuan ini berbeda dengan tabel BigQuery untuk Apache Iceberg, yang memungkinkan Anda membuat tabel Apache Iceberg di BigQuery dalam format yang dapat ditulis.
Iceberg adalah format tabel open source yang mendukung tabel data berskala petabyte. Spesifikasi terbuka Iceberg memungkinkan Anda menjalankan beberapa mesin kueri pada satu salinan data yang disimpan di penyimpanan objek. Tabel eksternal BigLake untuk Apache Iceberg (selanjutnya disebut tabel BigLake Iceberg) mendukung spesifikasi Iceberg versi 2, termasuk penggabungan saat membaca.
Sebagai administrator BigQuery, Anda dapat menerapkan kontrol akses tingkat baris dan kolom, termasuk penyamaran data pada tabel. Untuk informasi tentang cara menyiapkan kontrol akses di tingkat tabel, lihat Menyiapkan kebijakan kontrol akses. Kebijakan akses tabel juga diterapkan saat Anda menggunakan BigQuery Storage API sebagai sumber data untuk tabel di Dataproc dan Serverless Spark. Tabel BigLake memberikan integrasi tambahan dengan layanan BigQuery lainnya. Untuk daftar lengkap integrasi yang tersedia, lihat Pengantar tabel BigLake.
Anda dapat membuat tabel BigLake Iceberg dengan cara berikut:
Dengan metastore BigQuery (direkomendasikan untuk Google Cloud). Metastore BigQuery didasarkan pada katalog BigQuery dan terintegrasi langsung dengan BigQuery. Tabel di metastore BigQuery dapat diubah dari beberapa mesin open source, dan tabel yang sama dapat dikueri dari BigQuery. Metastore BigQuery juga mendukung integrasi langsung dengan Apache Spark.
Dengan AWS Glue Data Catalog (direkomendasikan untuk AWS). AWS Glue adalah metode yang direkomendasikan untuk AWS karena merupakan repositori metadata terpusat tempat Anda menentukan struktur dan lokasi data yang disimpan di berbagai layanan AWS dan menyediakan kemampuan seperti penemuan skema otomatis dan integrasi dengan alat analisis AWS.
Dengan file metadata JSON Iceberg (direkomendasikan untuk Azure). Jika menggunakan file metadata JSON Iceberg, Anda harus mengupdate file metadata terbaru secara manual setiap kali ada update tabel. Anda dapat menggunakan prosedur tersimpan BigQuery untuk Apache Spark guna membuat tabel BigLake Iceberg yang mereferensikan file metadata Iceberg.
Untuk daftar lengkap batasan, lihat Batasan.
Berikut ini perbandingan tabel BigLake Iceberg dengan variasi 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 |
Sebelum memulai
Enable the BigQuery Connection and BigQuery Reservation APIs.
Jika menggunakan prosedur tersimpan untuk Spark di BigQuery guna membuat tabel BigLake Iceberg, Anda harus mengikuti langkah-langkah berikut:
Untuk menyimpan metadata tabel BigLake Iceberg dan file data di Cloud Storage, buat bucket Cloud Storage. Anda harus terhubung ke bucket Cloud Storage untuk mengakses file metadata. Untuk melakukannya, ikuti langkah-langkah berikut:
Peran yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk membuat tabel BigLake, minta administrator untuk memberi Anda peran IAM berikut pada project:
-
BigQuery Admin (
roles/bigquery.admin
) -
Storage Object Admin (
roles/storage.objectAdmin
)
Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.
Peran bawaan ini berisi izin yang diperlukan untuk membuat tabel BigLake. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:
Izin yang diperlukan
Izin berikut diperlukan untuk membuat tabel BigLake:
-
bigquery.tables.create
-
bigquery.connections.delegate
-
bigquery.jobs.create
Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.
Membuat tabel dengan metastore BigQuery
Sebaiknya buat tabel BigLake Iceberg dengan metastore BigQuery. Anda dapat menggunakan Apache Spark untuk membuat tabel ini. Cara yang mudah untuk melakukannya adalah menggunakan prosedur tersimpan BigQuery. Untuk mengetahui contohnya, lihat Membuat dan menjalankan prosedur tersimpan.
Membuat tabel dengan file metadata
Anda dapat membuat tabel BigLake Iceberg dengan file metadata JSON. Namun, ini bukan metode yang direkomendasikan karena Anda harus mengupdate URI file metadata JSON secara manual agar tabel BigLake selalu terbaru. Jika URI tidak selalu terbaru, kueri di BigQuery dapat gagal atau memberikan hasil yang berbeda dari mesin kueri lain yang langsung menggunakan katalog Iceberg.
File metadata tabel Iceberg dibuat di bucket Cloud Storage yang Anda tentukan saat membuat tabel Iceberg menggunakan Spark.
Pilih salah satu opsi berikut:
SQL
Gunakan pernyataan CREATE EXTERNAL TABLE
. Contoh berikut membuat tabel BigLake bernama myexternal-table
:
CREATE EXTERNAL TABLE myexternal-table WITH CONNECTION `myproject.us.myconnection` OPTIONS ( format = 'ICEBERG', uris = ["gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json"] )
Ganti nilai uris
dengan file metadata JSON terbaru untuk snapshot tabel tertentu.
Anda dapat mengaktifkan wajibkan filter partisi dengan menetapkan tanda require_partition_filter
.
bq
Dalam lingkungan command line, gunakan perintah bq mk --table
dengan dekorator @connection
untuk menentukan koneksi yang akan digunakan di akhir parameter --external_table_definition
.
Untuk mengaktifkan filter partisi yang diperlukan, gunakan --require_partition_filter
.
bq mk
--table
--external_table_definition=TABLE_FORMAT=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID
PROJECT_ID:DATASET.EXTERNAL_TABLE
Ganti kode berikut:
TABLE_FORMAT
: format tabel yang ingin Anda buatDalam kasus ini,
ICEBERG
.URI
: file metadata JSON terbaru untuk snapshot tabel tertentu.Misalnya,
gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json
.URI juga dapat mengarah ke lokasi cloud eksternal; seperti Amazon S3 atau Azure Blob Storage.
- Contoh untuk AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json
. - Contoh untuk Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json
.
- Contoh untuk AWS:
CONNECTION_PROJECT_ID
: project yang berisi koneksi untuk membuat tabel BigLake—misalnya,myproject
CONNECTION_REGION
: region yang berisi koneksi untuk membuat tabel BigLake—misalnya,us
CONNECTION_ID
: ID koneksi tabel—misalnya,myconnection
Saat Anda melihat detail koneksi di konsol Google Cloud, ID koneksi adalah nilai di bagian terakhir dari ID koneksi yang sepenuhnya memenuhi syarat yang ditampilkan di ID Koneksi—misalnya,
projects/myproject/locations/connection_location/connections/myconnection
DATASET
: nama set data BigQuery tempat Anda ingin membuat tabelMisalnya,
mydataset
.EXTERNAL_TABLE
: nama tabel yang ingin Anda buatMisalnya,
mytable
.
Mengupdate metadata tabel
Jika Anda menggunakan file metadata JSON untuk membuat tabel BigLake Iceberg, update definisi tabel ke metadata tabel terbaru. Untuk mengupdate skema atau file metadata, pilih salah satu opsi berikut:
bq
Buat file definisi tabel:
bq mkdef --source_format=ICEBERG \ "URI" > TABLE_DEFINITION_FILE
Gunakan perintah
bq update
dengan flag--autodetect_schema
:bq update --autodetect_schema --external_table_definition=TABLE_DEFINITION_FILE PROJECT_ID:DATASET.TABLE
Ganti yang berikut ini:
URI
: Cloud Storage URI dengan file metadata JSON terbaruMisalnya,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
.TABLE_DEFINITION_FILE
: nama file yang berisi skema tabelPROJECT_ID
: project ID yang berisi tabel yang ingin Anda updateDATASET
: set data yang berisi tabel yang ingin Anda updateTABLE
: tabel yang ingin Anda update
API
Gunakan metode tables.patch
dengan properti autodetect_schema
yang disetel ke true
:
PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/TABLE?autodetect_schema=true
Ganti yang berikut ini:
PROJECT_ID
: project ID yang berisi tabel yang ingin Anda updateDATASET
: set data yang berisi tabel yang ingin Anda updateTABLE
: tabel yang ingin Anda update
Dalam isi permintaan, tentukan nilai yang diupdate untuk kolom berikut:
{ "externalDataConfiguration": { "sourceFormat": "ICEBERG", "sourceUris": [ "URI" ] }, "schema": null }'
Ganti URI
dengan file metadata Iceberg terbaru. Contoh: gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
.
Menyiapkan kebijakan kontrol akses
Anda dapat menggunakan beberapa metode untuk mengontrol akses ke tabel BigLake:
Untuk petunjuk cara menyiapkan keamanan tingkat kolom, lihat panduan keamanan tingkat kolom.
Untuk petunjuk tentang cara menyiapkan penyamaran data, lihat panduan penyamaran data.
Untuk petunjuk tentang cara menyiapkan keamanan tingkat baris, lihat panduan keamanan tingkat baris.
Misalnya, Anda ingin membatasi akses baris untuk tabel mytable
dalam set data mydataset
:
+---------+---------+-------+ | country | product | price | +---------+---------+-------+ | US | phone | 100 | | JP | tablet | 300 | | UK | laptop | 200 | +---------+---------+-------+
Anda dapat membuat filter tingkat baris untuk Kim (kim@example.com
) yang membatasi aksesnya ke baris di mana country
sama dengan US
.
CREATE ROW ACCESS POLICY only_us_filter ON mydataset.mytable GRANT TO ('user:kim@example.com') FILTER USING (country = 'US');
Kemudian, Kim menjalankan kueri berikut:
SELECT * FROM projectid.mydataset.mytable;
Output hanya menampilkan baris di mana country
sama dengan US
:
+---------+---------+-------+ | country | product | price | +---------+---------+-------+ | US | phone | 100 | +---------+---------+-------+
Membuat kueri tabel BigLake
Untuk informasi selengkapnya, lihat Membuat kueri data Iceberg.
Pemetaan data
BigQuery mengonversi jenis data Iceberg menjadi jenis data BigQuery seperti yang ditampilkan dalam tabel berikut:
Jenis data Iceberg | Jenis data BigQuery |
---|---|
boolean |
BOOL |
int |
INT64 |
long |
INT64 |
float |
FLOAT64 |
double |
FLOAT64 |
Decimal(P/S) |
NUMERIC or BIG_NUMERIC depending on precision |
date |
DATE |
time |
TIME |
timestamp |
DATETIME |
timestamptz |
TIMESTAMP |
string |
STRING |
uuid |
BYTES |
fixed(L) |
BYTES |
binary |
BYTES |
list<Type> |
ARRAY<Type> |
struct |
STRUCT |
map<KeyType, ValueType> |
ARRAY<Struct<key KeyType, value ValueType>> |
Batasan
Tabel BigLake Iceberg memiliki batasan tabel BigLake dan juga batasan berikut:
Tabel yang menggunakan penggabungan saat membaca memiliki batasan berikut:
- Setiap file data dapat dikaitkan dengan maksimal 10.000 file hapus.
- Tidak lebih dari 100.000 ID kesetaraan dapat diterapkan ke file penghapusan.
- Anda dapat mengatasi keterbatasan ini dengan sering memadatkan file penghapusan, atau membuat tampilan di atas tabel Iceberg yang menghindari partisi yang sering bermutasi.
BigQuery mendukung pruning manifes menggunakan semua fungsi transformasi partisi Iceberg kecuali untuk
Bucket
. Untuk informasi tentang cara melakukan pruning partisi, lihat Membuat kueri tabel berpartisi. Kueri yang merujuk pada tabel BigLake Iceberg harus berisi literal dalam predikat dibandingkan dengan kolom yang dipartisi.Hanya file data Apache Parquet yang didukung.
Biaya penggabungan saat membaca
Penagihan on-demand untuk data penggabungan saat dibaca adalah jumlah pemindaian data berikut:
- Semua byte logis yang dibaca dalam file data (termasuk baris yang ditandai sebagai dihapus oleh posisi dan penghapusan persamaan).
- Byte logis yang dibaca memuat penghapusan persamaan dan posisi menghapus file untuk menemukan baris yang dihapus dalam file data.
Perlu filter partisi
Anda dapat mewajibkan penggunaan filter predikat dengan mengaktifkan
opsi require partition filter untuk tabel Iceberg.
Jika Anda mengaktifkan opsi ini, upaya untuk mengkueri tabel tanpa menentukan
klausa WHERE
yang selaras dengan setiap file manifes akan menghasilkan error berikut:
Cannot query over table project_id.dataset.table without a filter that can be used for partition elimination.
Setiap file manifes memerlukan setidaknya satu predikat yang sesuai untuk penghapusan partisi.
Anda dapat mengaktifkan require_partition_filter
dengan cara berikut saat membuat tabel Iceberg :
SQL
Gunakan pernyataan CREATE EXTERNAL TABLE
.Contoh berikut membuat tabel BigLake bernama TABLE
dengan mengaktifkan filter partisi yang diperlukan:
CREATE EXTERNAL TABLE TABLE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS ( format = 'ICEBERG', uris = [URI], require_partition_filter = true )
Ganti kode berikut:
TABLE
: nama tabel yang ingin Anda buat.PROJECT_ID
: project ID yang berisi tabel yang ingin Anda buat.REGION
: lokasi tempat Anda ingin membuat tabel Iceberg.CONNECTION_ID
: ID koneksi. Misalnya,myconnection
.URI
: Cloud Storage URI dengan file metadata JSON terbaru.Misalnya,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
.URI juga dapat mengarah ke lokasi cloud eksternal; seperti Amazon S3 atau Azure Blob Storage.
- Contoh untuk AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json
. - Contoh untuk Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json
.
- Contoh untuk AWS:
bq
Gunakan perintah bq mk --table
dengan dekorator @connection
untuk menentukan koneksi yang akan digunakan di akhir parameter --external_table_definition
.
Gunakan --require_partition_filter
untuk mengaktifkan filter partisi yang diperlukan.
Contoh berikut membuat tabel BigLake bernama TABLE
dengan mengaktifkan filter partisi yang diperlukan:
bq mk \ --table \ --external_table_definition=ICEBERG=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID \ PROJECT_ID:DATASET.EXTERNAL_TABLE \ --require_partition_filter
Ganti kode berikut:
URI
: file metadata JSON terbaru untuk snapshot tabel tertentuMisalnya,
gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json
.URI juga dapat mengarah ke lokasi cloud eksternal; seperti Amazon S3 atau Azure Blob Storage.
- Contoh untuk AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json
. - Contoh untuk Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json
.
- Contoh untuk AWS:
CONNECTION_PROJECT_ID
: project yang berisi koneksi untuk membuat tabel BigLake—misalnya,myproject
CONNECTION_REGION
: region yang berisi koneksi untuk membuat tabel BigLake. Misalnya,us
.CONNECTION_ID
: : ID koneksi. Misalnya,myconnection
.Saat Anda melihat detail koneksi di konsol Google Cloud, ID koneksi adalah nilai di bagian terakhir dari ID koneksi yang sepenuhnya memenuhi syarat yang ditampilkan di ID Koneksi—misalnya,
projects/myproject/locations/connection_location/connections/myconnection
DATASET
: nama BigQueryset data yang berisi tabel yang ingin Anda perbarui. Misalnya,
mydataset
.EXTERNAL_TABLE
: nama tabel yang ingin Anda buatMisalnya,
mytable
.
Anda juga dapat memperbarui tabel Iceberg untuk mengaktifkan filter partisi yang diperlukan.
Jika Anda tidak mengaktifkan opsi wajibkan filter partisi saat membuat tabel berpartisi, Anda dapat memperbarui tabel untuk menambahkan opsi tersebut.
bq
Gunakan perintah bq update
dan berikan flag --require_partition_filter
.
Contoh:
Untuk mengupdate mypartitionedtable
di mydataset
dalam project default Anda, masukkan:
bq update --require_partition_filter PROJECT_ID:DATASET.TABLE
Langkah berikutnya
- Pelajari prosedur tersimpan untuk Spark.
- Pelajari tabel BigLake.
- Pelajari kebijakan kontrol akses.
- Pelajari cara menjalankan kueri di BigQuery.
- Pelajari pernyataan dan dialek SQL yang didukung di BigQuery.