Membuat tabel eksternal hanya baca Apache Iceberg

Tabel eksternal hanya baca Apache Iceberg memungkinkan Anda mengakses tabel Apache Iceberg dengan kontrol akses yang lebih terperinci dalam format hanya baca. Kemampuan ini berbeda dengan tabel BigLake untuk Apache Iceberg di BigQuery, yang memungkinkan Anda membuat tabel 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 hanya baca Apache Iceberg (selanjutnya disebut tabel hanya baca Iceberg) mendukung spesifikasi Iceberg versi 2, termasuk gabungkan saat dibaca.

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.

Anda dapat membuat tabel hanya baca Iceberg dengan cara berikut:

  • Dengan metastore BigLake (direkomendasikan untuk Google Cloud). Metastore BigLake didasarkan pada katalog BigQuery dan terintegrasi langsung dengan BigQuery. Tabel di metastore BigLake dapat diubah dari beberapa mesin open source, dan tabel yang sama dapat dikueri dari BigQuery. BigLake Metastore 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 serta 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 hanya baca Iceberg yang mereferensikan file metadata Iceberg.

Untuk daftar lengkap batasan, lihat Batasan.

Sebelum memulai

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk membuat tabel hanya baca Iceberg, minta administrator untuk memberi Anda peran IAM berikut pada project:

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 hanya baca Iceberg. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk membuat tabel hanya baca Iceberg:

  • 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 BigLake

Sebaiknya buat tabel hanya baca Iceberg dengan metastore BigLake. 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 hanya baca Iceberg dengan file metadata JSON. Namun, ini bukan metode yang direkomendasikan karena Anda harus mengupdate URI file metadata JSON secara manual agar tabel hanya baca Iceberg 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 hanya baca Iceberg 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 menyetel 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 buat

    Dalam 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.
  • CONNECTION_PROJECT_ID: project yang berisi koneksi untuk membuat tabel hanya baca Iceberg—misalnya, myproject

  • CONNECTION_REGION: region yang berisi koneksi untuk membuat tabel hanya baca Iceberg—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 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 tabel

    Misalnya, mydataset.

  • EXTERNAL_TABLE: nama tabel yang ingin Anda buat

    Misalnya, mytable.

Mengupdate metadata tabel

Jika Anda menggunakan file metadata JSON untuk membuat tabel Iceberg hanya baca, update definisi tabel ke metadata tabel terbaru. Untuk mengupdate skema atau file metadata, pilih salah satu opsi berikut:

bq

  1. Buat file definisi tabel:

    bq mkdef --source_format=ICEBERG \
    "URI" > TABLE_DEFINITION_FILE
    
  2. 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 terbaru

      Misalnya, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    • TABLE_DEFINITION_FILE: nama file yang berisi skema tabel

    • PROJECT_ID: project ID yang berisi tabel yang ingin Anda update

    • DATASET: set data yang berisi tabel yang ingin Anda update

    • TABLE: 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 update
  • DATASET: set data yang berisi tabel yang ingin Anda update
  • TABLE: 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 mengontrol akses ke tabel hanya baca Iceberg melalui keamanan tingkat kolom, keamanan tingkat baris, dan penyamaran data.

Membuat kueri tabel Iceberg hanya baca

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 hanya baca Iceberg memiliki batasan tabel eksternal dan batasan berikut:

  • Tabel yang menggunakan gabungkan saat dibaca memiliki batasan berikut:

    • Setiap file data dapat dikaitkan dengan hingga 10.000 file penghapusan.
    • Maksimal 100.000 ID kesetaraan dapat diterapkan ke file penghapusan.
    • Anda dapat mengatasi batasan ini dengan sering memadatkan file penghapusan, atau membuat tampilan di atas tabel Iceberg yang menghindari partisi yang sering dimutasi.
  • 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 hanya baca Iceberg harus berisi literal dalam predikat dibandingkan dengan kolom yang dipartisi.

  • Hanya file data Apache Parquet yang didukung.

Biaya gabung saat dibaca

Penagihan sesuai permintaan untuk data gabung saat dibaca adalah jumlah pemindaian data berikut:

  • Semua byte logis yang dibaca dalam file data (termasuk baris yang ditandai sebagai dihapus berdasarkan posisi dan penghapusan kesamaan).
  • Byte logis yang dibaca saat memuat penghapusan kesamaan dan penghapusan posisi file untuk menemukan baris yang dihapus dalam file data.

Perlu filter partisi

Anda dapat mewajibkan penggunaan filter predikat dengan mengaktifkan opsi wajibkan filter partisi untuk tabel Iceberg Anda. Jika Anda mengaktifkan opsi ini, upaya untuk mengkueri tabel tanpa menentukan klausa WHERE yang sesuai 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 hanya baca Iceberg bernama TABLE dengan filter partisi wajib diaktifkan:

  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.

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 hanya baca Iceberg bernama TABLE dengan filter partisi wajib diaktifkan:

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 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.
  • CONNECTION_PROJECT_ID: project yang berisi koneksi untuk membuat tabel hanya baca Iceberg—misalnya, myproject

  • CONNECTION_REGION: region yang berisi koneksi untuk membuat tabel hanya baca Iceberg. Misalnya, us.

  • CONNECTION_ID: : ID koneksi. Misalnya, myconnection.

    Saat Anda melihat detail koneksi di konsol Google Cloud , ID koneksi adalah nilai di bagian terakhir ID koneksi yang sepenuhnya memenuhi syarat yang ditampilkan di ID Koneksi—misalnya projects/myproject/locations/connection_location/connections/myconnection

  • DATASET: nama BigQuery

    set data yang berisi tabel yang ingin Anda perbarui. Misalnya, mydataset.

  • EXTERNAL_TABLE: nama tabel yang ingin Anda buat

    Misalnya, 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