Fitur katalog runtime Lakehouse tambahan

Untuk menyesuaikan konfigurasi katalog runtime Lakehouse, Anda dapat menggunakan fitur tambahan berikut:

  • Prosedur Iceberg Apache Spark.
  • Opsi filter untuk tabel yang tidak didukung.
  • Penggantian koneksi BigQuery.
  • Kebijakan kontrol akses untuk tabel Apache Iceberg yang dikelola oleh katalog runtime Lakehouse.

Menggunakan prosedur Spark Apache Iceberg

Untuk menggunakan prosedur Apache Spark, Anda harus menyertakan ekstensi SQL Apache Iceberg dalam konfigurasi Apache Spark. Misalnya, Anda dapat membuat prosedur untuk melakukan roll back ke status sebelumnya.

Menggunakan Apache Spark SQL interaktif untuk melakukan roll back ke status sebelumnya

Anda dapat menggunakan prosedur Apache Spark untuk membuat, mengubah, dan melakukan roll back tabel ke status sebelumnya. Contoh:

  1. Membuat tabel Apache Spark:

    spark-sql \
       --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,BIGLAKE_ICEBERG_CATALOG_JAR \
       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
       --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
       --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \
       --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \
       --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY

    Ganti kode berikut:

    • BIGLAKE_ICEBERG_CATALOG_JAR: URI Cloud Storage dari plugin katalog kustom Apache Iceberg yang akan digunakan. Bergantung pada nomor versi Apache Iceberg Anda, pilih salah satu opsi berikut:
      • Iceberg 1.9.1: gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.9.1-1.0.1.jar
      • Iceberg 1.6.1: gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.2.jar
    • CATALOG_NAME: nama katalog yang mereferensikan tabel Apache Spark Anda.
    • PROJECT_ID: ID project Google Cloud .

    • WAREHOUSE_DIRECTORY: URI folder Cloud Storage tempat data warehouse Anda disimpan.

    USE `CATALOG_NAME`;
    CREATE NAMESPACE NAMESPACE_NAME;
    USE NAMESPACE NAMESPACE_NAME;
    CREATE TABLE NAMESPACE_NAME.TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY';
    INSERT INTO NAMESPACE_NAME.TABLE_NAME VALUES (1, "first row");
    DESCRIBE EXTENDED TABLE_NAME;

    Ganti kode berikut:

    • NAMESPACE_NAME: nama namespace yang merujuk ke tabel Apache Spark Anda.
    • TABLE_NAME: nama tabel yang mereferensikan tabel Apache Spark Anda.

    Output berisi detail tentang konfigurasi tabel:

    ...
    Table Properties [current-snapshot-id=1659239298328512231,format=iceberg/parquet,format-version=2,write.parquet.compression-codec=zstd]
    ...
  2. Ubah tabel lagi, lalu kembalikan ke snapshot 1659239298328512231 yang dibuat sebelumnya:

    ALTER TABLE TABLE_NAME ADD COLUMNS (newDoubleCol double);
    INSERT INTO TABLE_NAME VALUES (2, "second row", 2.5);
    SELECT * FROM TABLE_NAME;
    CALL CATALOG_NAME.system.set_current_snapshot('NAMESPACE_NAME.TABLE_NAME', SNAPSHOT_ID);
    SELECT * FROM TABLE_NAME;

    Ganti kode berikut:

    • SNAPSHOT_ID: ID snapshot yang akan Anda gunakan untuk melakukan roll back.

    Outputnya mirip dengan hal berikut ini:

    1 first row
    Time taken: 0.997 seconds, Fetched 1 row(s)

Memfilter tabel yang tidak didukung dari fungsi listingan tabel

Saat Anda menggunakan Apache Spark SQL dengan katalog runtime Lakehouse, perintah SHOW TABLES akan menampilkan semua tabel di namespace yang ditentukan, bahkan tabel yang tidak kompatibel dengan Apache Spark.

Untuk hanya menampilkan tabel yang didukung, aktifkan opsi filter_unsupported_tables:

spark-sql
  --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,BIGLAKE_ICEBERG_CATALOG_JAR \
  --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \
  --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \
  --conf spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION \
  --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY \
  --conf spark.sql.catalog.CATALOG_NAME.filter_unsupported_tables="true"

Ganti kode berikut:

  • BIGLAKE_ICEBERG_CATALOG_JAR: URI Cloud Storage dari plugin katalog kustom Apache Iceberg yang akan digunakan. Bergantung pada nomor versi Apache Iceberg Anda, pilih salah satu opsi berikut:
    • Iceberg 1.9.1: gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.9.1-1.0.1.jar
    • Iceberg 1.6.1: gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.2.jar
  • CATALOG_NAME: nama katalog Apache Spark yang akan digunakan.
  • PROJECT_ID: ID project Google Cloud yang akan digunakan.
  • LOCATION: lokasi resource BigQuery.
  • WAREHOUSE_DIRECTORY: folder Cloud Storage yang akan digunakan sebagai data warehouse.

Menetapkan penggantian koneksi BigQuery

Anda dapat menggunakan koneksi BigQuery untuk mengakses data yang disimpan di luar BigQuery, seperti di Cloud Storage.

Untuk menetapkan penggantian koneksi BigQuery yang memberikan akses ke bucket Cloud Storage, selesaikan langkah-langkah berikut:

  1. Di project BigQuery Anda, buat koneksi baru ke resource Cloud Storage Anda. Koneksi ini menentukan cara BigQuery mengakses data Anda.

  2. Beri pengguna atau akun layanan yang mengakses data peran roles/bigquery.connectionUser pada koneksi.

    Pastikan resource koneksi memiliki lokasi yang sama dengan resource target di BigQuery. Untuk mengetahui informasi selengkapnya, lihat Mengelola koneksi.

  3. Tentukan koneksi di tabel Apache Iceberg Anda dengan properti bq_connection:

    CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY' TBLPROPERTIES ('bq_connection'='projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID');

    Ganti kode berikut:

    • TABLE_NAME: nama tabel untuk tabel Apache Spark Anda.
    • WAREHOUSE_DIRECTORY: URI bucket Cloud Storage yang menyimpan data Anda.
    • PROJECT_ID: ID project Google Cloud yang akan digunakan.
    • LOCATION: lokasi koneksi.
    • CONNECTION_ID: ID koneksi.

Menetapkan kebijakan kontrol akses

Anda dapat mengaktifkan kontrol akses terperinci (FGAC) pada tabel Iceberg terkelola di BigQuery dengan mengonfigurasi kebijakan kontrol akses. Anda hanya dapat menetapkan kebijakan kontrol akses pada tabel yang menggunakan penggantian koneksi BigQuery. Anda dapat menetapkan kebijakan ini dengan cara berikut:

Setelah mengonfigurasi kebijakan FGAC, Anda dapat mengkueri tabel dari Apache Spark menggunakan contoh berikut:

from pyspark.sql import SparkSession

# Create a Spark session
spark = SparkSession.builder \
.appName("Lakehouse runtime catalog Iceberg") \
.config("spark.sql.catalog.CATALOG_NAME", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.CATALOG_NAME.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \
.config("spark.sql.catalog.CATALOG_NAME.gcp_project", "PROJECT_ID") \
.config("spark.sql.catalog.CATALOG_NAME.gcp_location", "LOCATION") \
.config("spark.sql.catalog.CATALOG_NAME.warehouse", "WAREHOUSE_DIRECTORY") \
.getOrCreate()

spark.sql("USE `CATALOG_NAME`;")

# Configure spark for storing temp results
spark.conf.set("viewsEnabled","true")
spark.sql("CREATE NAMESPACE IF NOT EXISTS MATERIALIZATION_NAMESPACE");
spark.conf.set("materializationDataset","MATERIALIZATION_NAMESPACE")

spark.sql("USE NAMESPACE DATASET_NAME;")

sql = """SELECT * FROM DATASET_NAME.ICEBERG_TABLE_NAME"""
df = spark.read.format("bigquery").load(sql)
df.show()

Ganti kode berikut:

  • CATALOG_NAME: nama katalog Anda.
  • PROJECT_ID: ID project yang berisi resource BigQuery Anda.
  • LOCATION: lokasi resource BigQuery.
  • WAREHOUSE_DIRECTORY: URI folder Cloud Storage yang berisi data warehouse Anda.
  • MATERIALIZATION_NAMESPACE: namespace tempat Anda ingin menyimpan hasil sementara.
  • DATASET_NAME: nama set data yang berisi tabel yang Anda kueri.
  • ICEBERG_TABLE_NAME: nama tabel yang Anda kueri.

Langkah berikutnya