BigLake-externe Tabellen für Apache Iceberg erstellen

Mit externen BigLake-Tabellen können Sie über eine detailliertere Zugriffssteuerung im Lesezugriffsformat auf Apache Iceberg-Tabellen zugreifen. Diese Funktion unterscheidet sich von BigQuery-Tabellen für Apache Iceberg, mit denen Sie Apache 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 BigLake-Tabellen für Apache Iceberg (im Folgenden BigLake Iceberg-Tabellen) unterstützen die 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. BigLake-Tabellen bieten zusätzliche Integrationen in andere BigQuery-Dienste. Eine vollständige Liste der verfügbaren Integrationen finden Sie unter Einführung in BigLake-Tabellen.

Sie können Iceberg-BigLake-Tabellen auf folgende Arten erstellen:

  • Mit BigQuery Metastore (empfohlen für Google Cloud) Der BigQuery-Metastore basiert auf dem BigQuery-Katalog und lässt sich direkt in BigQuery einbinden. Tabellen im BigQuery-Metastore können über mehrere Open-Source-Engines geändert werden. Dieselben Tabellen können auch über BigQuery abgefragt werden. Der BigQuery 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 Eisberg-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 BigLake Iceberg-Tabellen zu erstellen, die auf eine Iceberg-Metadatendatei verweisen.

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

Vorbereitung

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 BigLake-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 BigLake-Tabelle erforderlich sind. Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind zum Erstellen einer BigLake-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 BigQuery Metastore erstellen

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

Tabellen mit einer Metadatendatei erstellen

Sie können BigLake-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 BigLake-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 BigLake-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. auf 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 BigLake-Tabelle enthält, z. B. myproject

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

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

    Wenn Sie sich Verbindungsdetails in der 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. Google Cloud

  • 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 BigLake-Iceberg-Tabelle verwenden, aktualisieren Sie die Tabellendefinition auf die neuesten Tabellenmetadaten. Wählen Sie eine der folgenden Optionen, 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 BigLake-Tabellen auf verschiedene Arten steuern:

Angenommen, Sie möchten den Zeilenzugriff für die Tabelle mytable im Dataset mydataset beschränken:

+---------+---------+-------+
| country | product | price |
+---------+---------+-------+
| US      | phone   |   100 |
| JP      | tablet  |   300 |
| UK      | laptop  |   200 |
+---------+---------+-------+

Sie können einen Filter auf Zeilenebene für Kim (kim@example.com) erstellen, der den Zugriff auf Zeilen beschränkt, in denen country gleich US ist.

CREATE ROW ACCESS POLICY only_us_filter
ON mydataset.mytable
GRANT TO ('user:kim@example.com')
FILTER USING (country = 'US');

Dann führt vCenter die folgende Abfrage aus:

SELECT * FROM projectid.mydataset.mytable;

Die Ausgabe zeigt nur die Zeilen, in denen country gleich US ist:

+---------+---------+-------+
| country | product | price |
+---------+---------+-------+
| US      | phone   |   100 |
+---------+---------+-------+

BigLake-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 BigLake-Iceberg-Tabellen gelten BigLake-Tabelleneinschränkungen sowie die folgenden Einschränkungen:

  • Für Tabellen mit Zusammenführen beim Lesen 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 entweder gelöschte Dateien häufig komprimieren oder eine Ansicht über der Iceberg-Tabelle erstellen, die häufig mutierte Partitionen verhindert.
  • 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 BigLake-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 die Zusammenführung bei der Lesevorgang

Die On-Demand-Abrechnung für Daten mit Zusammenführen beim Lesen entspricht der Summe der Scans der folgenden Daten:

  • Alle logischen Bytes, die in der Datendatei gelesen wurden, einschließlich Zeilen, die durch Positions- und Gleichheitslöschungen als gelöscht gekennzeichnet sind.
  • Logische gelesene Bytes beim Laden der Dateien „delete by equality“ und „delete by position“, 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 BigLake-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 dabei 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. auf 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 BigLake-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 dabei 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. auf 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 BigLake-Tabelle enthält, z. B. myproject

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

  • CONNECTION_ID: die Verbindungs-ID Beispiel: myconnection

    Wenn Sie sich Verbindungsdetails in der 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. Google Cloud

  • 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