Schreibgeschützte externe Apache Iceberg-Tabellen erstellen

Mit schreibgeschützten externen Apache Iceberg-Tabellen können Sie mit einer detaillierteren Zugriffssteuerung in einem schreibgeschützten Format auf Apache Iceberg-Tabellen zugreifen. Diese Funktion steht im Gegensatz zu BigLake-Tabellen für Apache Iceberg in BigQuery, mit denen Sie Iceberg-Tabellen in BigQuery in einem beschreibbaren Format erstellen können.

Iceberg ist ein Open-Source-Tabellenformat, das Datentabellen im Petabytebereich unterstützt. Mit der offenen Spezifikation von Iceberg können Sie mehrere Abfrage-Engines auf einer einzigen Kopie von Daten ausführen, die in einem Objektspeicher gespeichert sind. Externe Apache Iceberg-Tabellen mit Lesezugriff (im Folgenden als Iceberg-Tabellen mit Lesezugriff bezeichnet) unterstützen Iceberg-Spezifikation Version 2, einschließlich Merge-on-Read.

Als BigQuery-Administrator können Sie die Zugriffssteuerung auf Zeilen- und Spaltenebene erzwingen, einschließlich der Datenmaskierung für Tabellen. Informationen zum Einrichten der Zugriffssteuerung auf Tabellenebene finden Sie unter Zugriffssteuerungsrichtlinien einrichten. Tabellenzugriffsrichtlinien werden auch erzwungen, wenn Sie die BigQuery Storage API als Datenquelle für die Tabelle in Dataproc und serverlosem Spark verwenden.

Sie können schreibgeschützte Iceberg-Tabellen auf folgende Arten erstellen:

  • Mit BigLake Metastore (für Google Cloudempfohlen) BigLake Metastore basiert auf dem BigQuery-Katalog und ist direkt in BigQuery integriert. Tabellen im BigLake-Metastore können von mehreren Open-Source-Engines geändert werden und dieselben Tabellen können in BigQuery abgefragt werden. BigLake Metastore unterstützt auch die direkte Einbindung in Apache Spark.

  • Mit AWS Glue Data Catalog (für AWS empfohlen). AWS Glue ist die empfohlene Methode für AWS, da es sich um ein zentrales Metadaten-Repository handelt, in dem Sie die Struktur und den Speicherort Ihrer in verschiedenen AWS-Diensten gespeicherten Daten definieren. Außerdem bietet es Funktionen wie die automatische Schemaerkennung und Integration in AWS-Analysetools.

  • Mit Iceberg-JSON-Metadatendateien (für Azure empfohlen). Wenn Sie eine Iceberg-JSON-Metadatendatei verwenden, müssen Sie die neueste Metadatendatei manuell aktualisieren, wenn Tabellenaktualisierungen vorhanden sind. Sie können eine gespeicherte BigQuery-Prozedur für Apache Spark verwenden, um schreibgeschützte Iceberg-Tabellen zu erstellen, die auf eine Iceberg-Metadatendatei verweisen.

Eine vollständige Liste der Beschränkungen finden Sie unter Einschränkungen.

Hinweise

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für das Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen einer schreibgeschützten Iceberg-Tabelle benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierten Rollen enthalten die Berechtigungen, die zum Erstellen einer schreibgeschützten Iceberg-Tabelle erforderlich sind. Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind zum Erstellen einer schreibgeschützten Iceberg-Tabelle erforderlich:

  • bigquery.tables.create
  • bigquery.connections.delegate
  • bigquery.jobs.create

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Tabellen mit BigLake Metastore erstellen

Wir empfehlen, schreibgeschützte Iceberg-Tabellen mit BigLake Metastore zu erstellen. Sie können diese Tabellen mit Apache Spark erstellen. Eine bequeme Methode ist die Verwendung von gespeicherten Prozeduren in BigQuery. Ein Beispiel finden Sie unter Gespeicherte Prozedur erstellen und ausführen.

Tabellen mit einer Metadatendatei erstellen

Sie können schreibgeschützte Iceberg-Tabellen mit einer JSON-Metadatendatei erstellen. Dies ist jedoch nicht die empfohlene Methode, da Sie den URI der JSON-Metadatendatei manuell aktualisieren müssen, um die schreibgeschützte Iceberg-Tabelle auf dem neuesten Stand zu halten. Wenn der URI nicht aktuell ist, können Abfragen in BigQuery fehlschlagen oder zu anderen Ergebnissen von anderen Abfrage-Engines führen, die direkt einen Iceberg-Katalog verwenden.

Iceberg-Tabellenmetadatendateien werden in dem Cloud Storage-Bucket erstellt, den Sie beim Erstellen einer Iceberg-Tabelle mit Spark angeben.

Wählen Sie eine der folgenden Optionen aus:

SQL

Verwenden Sie die Anweisung CREATE EXTERNAL TABLE. Im folgenden Beispiel wird eine schreibgeschützte Iceberg-Tabelle mit dem Namen myexternal-table erstellt:

  CREATE EXTERNAL TABLE myexternal-table
  WITH CONNECTION `myproject.us.myconnection`
  OPTIONS (
         format = 'ICEBERG',
         uris = ["gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json"]
   )

Ersetzen Sie den Wert uris durch die neueste JSON-Metadatendatei für einen bestimmten Tabellen-Snapshot.

Sie können die Option Partitionsfilter anfordern aktivieren, indem Sie das Flag require_partition_filter festlegen.

bq

In einer Befehlszeilenumgebung verwenden Sie den Befehl bq mk --table mit dem Decorator @connection, um die Verbindung anzugeben, die am Ende des Parameters --external_table_definition verwendet werden soll. : Verwenden Sie --require_partition_filter, um den Filter "Partitionsfilter anfordern" zu aktivieren.

bq mk 
--table
--external_table_definition=TABLE_FORMAT=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID
PROJECT_ID:DATASET.EXTERNAL_TABLE

Ersetzen Sie dabei Folgendes:

  • TABLE_FORMAT: Das Format der Tabelle, die Sie erstellen möchten.

    In diesem Fall ist das ICEBERG.

  • URI: die neueste JSON-Metadatendatei für einen bestimmten Tabellen-Snapshot

    Beispiel: gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.

    Der URI kann auch auf einen externen Cloud-Speicherort verweisen, z. B. Amazon S3 oder Azure Blob Storage.

    • Beispiel für AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Beispiel für Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
  • CONNECTION_PROJECT_ID: Das Projekt, das die Verbindung zum Erstellen der schreibgeschützten Iceberg-Tabelle enthält, z. B. myproject

  • CONNECTION_REGION: Die Region, die die Verbindung zum Erstellen der schreibgeschützten Iceberg-Tabelle enthält, z. B. us.

  • CONNECTION_ID: Die ID der Tabellenverbindung, z. B. myconnection

    Wenn Sie sich Verbindungsdetails in der Google Cloud Console ansehen, ist die Verbindungs-ID der Wert im letzten Abschnitt der voll qualifizierten Verbindungs-ID, der unter Verbindungs-ID angezeigt wird, z. B. projects/myproject/locations/connection_location/connections/myconnection.

  • DATASET: Der Name des BigQuery-Datasets, in dem Sie eine Tabelle erstellen möchten

    Beispiel: mydataset.

  • EXTERNAL_TABLE: Der Name der Tabelle, die Sie erstellen möchten

    Beispiel: mytable.

Tabellenmetadaten aktualisieren

Wenn Sie eine JSON-Metadatendatei zum Erstellen einer schreibgeschützten Iceberg-Tabelle verwenden, aktualisieren Sie die Tabellendefinition auf die neuesten Tabellenmetadaten. Wählen Sie eine der folgenden Optionen aus, um das Schema oder die Metadatendatei zu aktualisieren:

bq

  1. Erstellen Sie eine Tabellendefinitionsdatei.

    bq mkdef --source_format=ICEBERG \
    "URI" > TABLE_DEFINITION_FILE
    
  2. Führen Sie den Befehl bq update mit dem Flag --autodetect_schema aus:

    bq update --autodetect_schema --external_table_definition=TABLE_DEFINITION_FILE
    PROJECT_ID:DATASET.TABLE
    

    Ersetzen Sie dabei Folgendes:

    • URI: Ihr Cloud Storage-URI mit der neuesten JSON-Metadatendatei

      Beispiel: gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    • TABLE_DEFINITION_FILE: Der Name der Datei, die das Tabellenschema enthält

    • PROJECT_ID: Die Projekt-ID mit der Tabelle, die Sie aktualisieren möchten

    • DATASET ist das Dataset mit der Tabelle, die Sie aktualisieren möchten.

    • TABLE: Die Tabelle, von der Sie einen Snapshot erstellen möchten

API

Verwenden Sie die Methode tables.patch und setzen Sie das Attribut autodetect_schema auf true:

PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/TABLE?autodetect_schema=true

Ersetzen Sie dabei Folgendes:

  • PROJECT_ID: die Projekt-ID, die die Tabelle enthält, die Sie aktualisieren möchten
  • DATASET ist das Dataset mit der Tabelle, die Sie aktualisieren möchten.
  • TABLE: Die Tabelle, von der Sie einen Snapshot erstellen möchten

Geben Sie im Anfragetext die aktualisierten Werte für die folgenden Felder an:

{
     "externalDataConfiguration": {
      "sourceFormat": "ICEBERG",
      "sourceUris": [
        "URI"
      ]
    },
    "schema": null
  }'

Ersetzen Sie URI durch die neueste Iceberg-Metadatendatei. Beispiel: gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json

Zugriffssteuerungsrichtlinien einrichten

Sie können den Zugriff auf schreibgeschützte Iceberg-Tabellen über Sicherheit auf Spaltenebene, Sicherheit auf Zeilenebene und Datenmaskierung steuern.

Schreibgeschützte Iceberg-Tabellen abfragen

Weitere Informationen finden Sie unter Iceberg-Daten abfragen.

Datenabgleich

BigQuery konvertiert Iceberg-Datentypen in BigQuery-Datentypen, wie in der folgenden Tabelle dargestellt:

Datentyp „Iceberg“ BigQuery-Datentyp
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>>

Beschränkungen

Für schreibgeschützte Iceberg-Tabellen gelten Einschränkungen für externe Tabellen sowie die folgenden Einschränkungen:

  • Für Tabellen, die Merge-on-Read verwenden, gelten die folgenden Einschränkungen:

    • Jede Datendatei kann mit bis zu 10.000 Löschdateien verknüpft werden.
    • Auf eine Löschdatei können höchstens 100.000 Gleichheits-IDs angewendet werden.
    • Sie können diese Einschränkungen umgehen, indem Sie Löschdateien häufig komprimieren oder eine Ansicht für die Iceberg-Tabelle erstellen, in der Partitionen, die häufig geändert werden, vermieden werden.
  • BigQuery unterstützt die Manifestbereinigung mit allen Iceberg-Partitionstransformationsfunktionen mit Ausnahme von Bucket. Weitere Informationen zum Bereinigen von Partitionen finden Sie unter Partitionierte Tabellen abfragen. Abfragen, die sich auf schreibgeschützte Iceberg-Tabellen beziehen, müssen Literale in Prädikaten enthalten, die in Spalten partitioniert sind.

  • Nur Apache Parquet-Datendateien werden unterstützt.

Kosten für Merge-on-Read

Die On-Demand-Abrechnung für Merge-on-Read-Daten ist die Summe der Scans der folgenden Daten:

  • Alle logischen Bytes, die in der Datendatei gelesen werden, einschließlich der Zeilen, die durch Positions- und Gleichheitslöschungen als gelöscht markiert sind.
  • Logische Bytes, die beim Laden der Dateien zum Löschen von Gleichheits- und Positionsdaten gelesen werden, um die gelöschten Zeilen in einer Datendatei zu finden.

Partitionsfilter anfordern

Sie können die Verwendung von Prädikatfiltern anfordern, wenn Sie die Option Partitionsfilter anfordern für Ihre Iceberg-Tabelle aktivieren. Wenn Sie diese Option aktivieren, führen Versuche, die Tabelle ohne Angabe einer WHERE-Klausel abzufragen, die mit jeder Manifestdatei übereinstimmt, zu folgendem Fehler:

Cannot query over table project_id.dataset.table without a
filter that can be used for partition elimination.

Jede Manifestdatei erfordert mindestens ein Prädikat, das für die Eliminierung der Partition geeignet ist.

Sie können require_partition_filter beim Erstellen einer Iceberg-Tabelle so aktivieren :

SQL

Verwenden Sie die Anweisung CREATE EXTERNAL TABLE.Im folgenden Beispiel wird eine schreibgeschützte Iceberg-Tabelle mit dem Namen TABLE mit aktiviertem Filter "Partitionsfilter anfordern" erstellt:

  CREATE EXTERNAL TABLE TABLE
  WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
  OPTIONS (
         format = 'ICEBERG',
         uris = [URI],
         require_partition_filter = true
   )

Ersetzen Sie Folgendes:

  • TABLE ist der Tabellenname, den Sie erstellen möchten.
  • PROJECT_ID: Die Projekt-ID mit der Tabelle, die Sie aktualisieren möchten
  • REGION ist der Standort, an dem Sie die Iceberg-Tabelle erstellen möchten.
  • CONNECTION_ID: die Verbindungs-ID Beispiel: myconnection.

  • URI: Ihr Cloud Storage-URI mit der neuesten JSON-Metadatendatei

    Beispiel: gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    Der URI kann auch auf einen externen Cloud-Speicherort verweisen, z. B. Amazon S3 oder Azure Blob Storage.

    • Beispiel für AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Beispiel für Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.

bq

Verwenden Sie den Befehl bq mk --table mit dem Decorator @connection, um die Verbindung anzugeben, die am Ende des Parameters --external_table_definition verwendet werden soll. Verwenden Sie --require_partition_filter, um den Filter "Partitionsfilter anfordern" zu aktivieren. Im folgenden Beispiel wird eine schreibgeschützte Iceberg-Tabelle mit dem Namen TABLE erstellt, wobei ein Filter "Partitionsfilter anfordern" aktiviert ist:

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

Ersetzen Sie Folgendes:

  • URI: die neueste JSON-Metadatendatei für einen bestimmten Tabellen-Snapshot

    Beispiel: gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.

    Der URI kann auch auf einen externen Cloud-Speicherort verweisen, z. B. Amazon S3 oder Azure Blob Storage.

    • Beispiel für AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Beispiel für Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
  • CONNECTION_PROJECT_ID: Das Projekt, das die Verbindung zum Erstellen der schreibgeschützten Iceberg-Tabelle enthält, z. B. myproject

  • CONNECTION_REGION: Die Region, die die Verbindung zum Erstellen der schreibgeschützten Iceberg-Tabelle enthält. Beispiel: us

  • CONNECTION_ID: die Verbindungs-ID Beispiel: myconnection

    Wenn Sie sich Verbindungsdetails in der Google Cloud Console ansehen, ist die Verbindungs-ID der Wert im letzten Abschnitt der voll qualifizierten Verbindungs-ID, der unter Verbindungs-ID angezeigt wird, z. B. projects/myproject/locations/connection_location/connections/myconnection.

  • DATASET ist der Name des BigQuery-

    Datasets, das die zu aktualisierende Tabelle enthält. Beispiel: mydataset.

  • EXTERNAL_TABLE: Der Name der Tabelle, die Sie erstellen möchten

    Beispiel: mytable.

Sie können auch Ihre Iceberg-Tabelle aktualisieren, um den Filter "Partitionsfilter anfordern" zu aktivieren.

Wenn Sie die Option Partitionsfilter anfordern beim Erstellen der partitionierten Tabelle nicht aktiviert haben, können Sie die Tabelle aktualisieren, um die Option hinzuzufügen.

bq

Verwenden Sie den bq updateBefehl --require_partition_filter und geben Sie das Flag an.

Beispiel:

Zum Aktualisieren von mypartitionedtable in mydataset in Ihrem Standardprojekt geben Sie Folgendes ein:

bq update --require_partition_filter PROJECT_ID:DATASET.TABLE

Nächste Schritte