Apache Iceberg BigLake-Tabellen erstellen

Mit BigLake können Sie über eine detailliertere Zugriffssteuerung auf Iceberg-Tabellen zugreifen. Dazu müssen Sie zuerst eine BigLake-Iceberg-Tabelle erstellen.

Apache 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.

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 BigLake Metastore (für Google Cloud empfohlen). BigLake Metastore ist ein benutzerdefinierter Iceberg-Katalog. Die Verwendung von BigLake Metastore wird für Google Cloud empfohlen, da es die Synchronisierung von Tabellen zwischen Spark- und BigQuery-Arbeitslasten ermöglicht. Dazu können Sie ein in BigQuery gespeichertes Verfahren für Apache Spark verwenden, um BigLake Metastore zu initialisieren und die BigLake Iceberg-Tabelle zu erstellen. Für Schemaaktualisierungen muss jedoch weiterhin eine Aktualisierungsabfrage in BigQuery ausgeführt werden.

  • 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. Wenn Sie dies vermeiden möchten, können Sie BigLake Metastore für Google Cloud oder AWS Glue Data Catalog für AWS verwenden.

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

Vorbereitung

  • Enable the BigQuery Connection, BigQuery Reservation, and BigLake APIs.

    Enable the APIs

  • Wenn Sie eine gespeicherte Prozedur für Apache Spark in BigQuery verwenden, um BigLake-Iceberg-Tabellen zu erstellen, müssen Sie die folgenden Schritte ausführen:

    1. Spark-Verbindung erstellen
    2. Richten Sie die Zugriffssteuerung für diese Verbindung ein.
  • Erstellen Sie einen Cloud Storage-Bucket, um die Metadaten und Datendateien von Iceberg BigLake in Cloud Storage zu speichern. Sie müssen eine Verbindung zu Ihrem Cloud Storage-Bucket herstellen, um auf Metadatendateien zuzugreifen. Führen Sie dazu die folgenden Schritte aus:

    1. Cloud-Ressourcen-Verbindung erstellen
    2. Richten Sie den Zugriff für diese Verbindung ein.
  • Wenn Sie BigLake Metastore verwenden, installieren Sie den entsprechenden benutzerdefinierten Iceberg-Katalog für Apache Spark. Wählen Sie die Version des benutzerdefinierten Katalogs aus, die der von Ihnen verwendeten Iceberg-Version am besten entspricht.

    1. Iceberg 1.5.0: gs://spark-lib/biglake/biglake-catalog-iceberg1.5.0-0.1.1-with-dependencies.jar
    2. Iceberg 1.2.0: gs://spark-lib/biglake/biglake-catalog-iceberg1.2.0-0.1.1-with-dependencies.jar
    3. Iceberg 0.14.0: gs://spark-lib/biglake/biglake-catalog-iceberg0.14.0-0.1.1-with-dependencies.jar

Erforderliche Rollen

Bitten Sie Ihren Administrator, dem Aufrufer der BigLake API die folgenden IAM-Rollen für das Projekt zuzuweisen, um sicherzustellen, dass der Aufrufer der BigLake API die erforderlichen Berechtigungen zum Erstellen einer BigLake-Tabelle hat.

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

Ihr Administrator kann dem Aufrufer der BigLake API möglicherweise auch diese Berechtigungen mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erteilen.

Darüber hinaus muss das mit der Verbindung verknüpfte Dienstkonto die Rolle „BigLake-Betrachter“ (roles/biglake.viewer) und Zugriff auf den Cloud Storage-Bucket haben, der diese Daten enthält, damit BigQuery-Nutzer die Tabelle abfragen können.

Zum Erstellen von BigLake-Iceberg-Tabellen mit BigLake Metastore ändert sich der Aufrufer der BigLake API. Sie müssen dem Dataproc- oder Spark-Dienstkonto Zugriff auf den Cloud Storage-Bucket gewähren, der diese Daten enthält:

Tabellen mit BigLake Metastore erstellen

Wir empfehlen, Iceberg-BigLake-Tabellen mit BigLake Metastore zu erstellen. Sie können diese Tabellen mit Apache Spark erstellen. Eine bequeme Methode ist die Verwendung von gespeicherten Prozeduren für Spark in BigQuery, indem Sie die folgenden Schritte ausführen:

  1. Rufen Sie die Seite BigQuery auf.

    BigQuery aufrufen

  2. Klicken Sie im Bereich Explorer auf die Verbindung in dem Projekt, in dem Sie die Verbindungsressource erstellt haben.

  3. Zum Erstellen einer gespeicherten Prozedur für Apache Spark klicken Sie auf Gespeicherte Prozedur erstellen.

  4. Ändern Sie im Abfrageeditor den Beispielcode zum Initialisieren von BigLake Metastore und zum Erstellen einer Iceberg BigLake-Tabelle mithilfe der angezeigten Anweisung CREATE PROCEDURE:

     # Creates a stored procedure that initializes BLMS and database.
     # Creates a table in the database and populates a few rows of data.
     CREATE OR REPLACE PROCEDURE iceberg_demo.iceberg_setup_3_3 ()
     WITH CONNECTION `PROCEDURE_CONNECTION_PROJECT_ID.PROCEDURE_CONNECTION_REGION.PROCEDURE_CONNECTION_ID`
     OPTIONS(engine="SPARK",
     jar_uris=["gs://spark-lib/biglake/biglake-catalog-iceberg1.2.0-0.1.0-with-dependencies.jar"],
     properties=[
     ("spark.jars.packages","org.apache.iceberg:iceberg-spark-runtime-3.3_2.12:1.2.0"),
     ("spark.sql.catalog.CATALOG", "org.apache.iceberg.spark.SparkCatalog"),
     ("spark.sql.catalog.CATALOG.catalog-impl", "org.apache.iceberg.gcp.biglake.BigLakeCatalog"),
     ("spark.sql.catalog.CATALOG.hms_uri", "HMS_URI"),
     ("spark.sql.catalog.CATALOG.gcp_project", "PROJECT_ID"),
     ("spark.sql.catalog.CATALOG.gcp_location", "LOCATION"),
     ("spark.sql.catalog.CATALOG.blms_catalog", "CATALOG"),
     ("spark.sql.catalog.CATALOG.warehouse", "DATA_WAREHOUSE_URI")
     ]
     )
     LANGUAGE PYTHON AS R'''
     from pyspark.sql import SparkSession
    
     spark = SparkSession \
       .builder \
       .appName("BigLake Iceberg Example") \
       .enableHiveSupport() \
       .getOrCreate()
    
     spark.sql("CREATE NAMESPACE IF NOT EXISTS CATALOG;")
     spark.sql("CREATE DATABASE IF NOT EXISTS CATALOG.CATALOG_DB;")
     spark.sql("DROP TABLE IF EXISTS CATALOG.CATALOG_DB.CATALOG_TABLE;")
    
     # Create a BigLake Metastore table and a BigQuery Iceberg table.
     spark.sql("CREATE TABLE IF NOT EXISTS CATALOG.CATALOG_DB.CATALOG_TABLE (id bigint, demo_name string)
               USING iceberg
               TBLPROPERTIES(bq_table='BQ_DATASET.BQ_TABLE', bq_connection='TABLE_CONNECTION_PROJECT_ID.TABLE_CONNECTION_REGION.TABLE_CONNECTION_ID');
               ")
    
     # Copy a Hive Metastore table to BigLake Metastore. Can be used together with
     #   TBLPROPERTIES `bq_table` to create a BigQuery Iceberg table.
     spark.sql("CREATE TABLE CATALOG.CATALOG_DB.CATALOG_TABLE (id bigint, demo_name string)
                USING iceberg
                TBLPROPERTIES(hms_table='HMS_DB.HMS_TABLE');")
     ''';
    

    Ersetzen Sie dabei Folgendes:

    • PROCEDURE_CONNECTION_PROJECT_ID: Das Projekt, das die Verbindung zum Ausführen von Spark-Verfahren enthält, z. B. myproject.

    • PROCEDURE_CONNECTION_REGION: Region, die die Verbindung zum Ausführen von Spark-Prozeduren enthält, z. B. us.

    • PROCEDURE_CONNECTION_ID: die Verbindungs-ID, 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.

    • CATALOG: Der Name des Iceberg-Katalogs, der für BigLake Metastore erstellt werden soll.

      Der Standardwert ist iceberg.

    • HMS_URI: Wenn Sie vorhandene Hive-Metastore-Tabellen in BigLake Metastore kopieren möchten, geben Sie einen Hive-Metastore-URI an.

      Beispiel: thrift://localhost:9083.

    • PROJECT_ID: Die Projekt-ID, in der Sie den BigLake Metastore-Katalog erstellen möchten.

      Iceberg BigLake-Tabellen werden ebenfalls im selben Projekt erstellt.

    • LOCATION: Der Standort, an dem Sie die BigLake Metastore-Instanz erstellen möchten.

      BigQuery kann nur auf BigLake-Metastore-Kataloge zugreifen, die am selben Standort gespeichert sind.

    • DATA_WAREHOUSE_URI: Der Cloud Storage-Bucket-URI, den Sie zum Speichern der Metadaten- und Datendateien aus Iceberg erstellt haben.

      Beispiel: gs://mybucket/iceberg-warehouse.

    • CATALOG_DB: Der Name der Datenbank, die Sie in BigLake Metastore erstellen möchten.

      Diese Datenbank entspricht dem BigQuery-Dataset, das die Iceberg BigLake-Tabelle enthält.

    • CATALOG_TABLE: Der Name der Tabelle, die Sie in BigLake Metastore erstellen möchten.

      Diese Tabelle entspricht der Iceberg BigLake-Tabelle, die Sie erstellen möchten.

    • BQ_DATASET ist das BigQuery-Dataset, das die Iceberg BigLake-Tabelle enthält.

    • BQ_TABLE: Die Iceberg BigLake-Tabelle, die Sie erstellen möchten.

    • TABLE_CONNECTION_PROJECT_ID: Das Projekt, das die Verbindung zum Erstellen der BigLake-Tabelle enthält, z. B. myproject

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

    • TABLE_CONNECTION_ID: die Verbindungs-ID, 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.

      Das mit der Verbindung verknüpfte Dienstkonto muss roles/biglake.viewer haben, damit BigQuery-Nutzer die Tabelle abfragen können.

    • HMS_DB: Wenn Sie vorhandene Hive-Metastore-Tabellen in BigLake Metastore kopieren möchten, geben Sie eine Hive Metastore-Datenbank an.

    • HMS_TABLE: Wenn Sie vorhandene Hive-Metastore-Tabellen in BigLake Metastore kopieren möchten, geben Sie eine Hive-Metastore-Tabelle an.

    Weitere Informationen zu Iceberg-Katalogkonfigurationen finden Sie unter Spark-Kataloge.

  5. Klicken Sie auf Ausführen, um die gespeicherte Prozedur auszuführen. Weitere Informationen zu Gespeichertes Spark-Verfahren aufrufen. In BigQuery wird eine Iceberg BigLake-Tabelle erstellt.

Tabellen mit einer Metadatendatei erstellen

Sie können Iceberg-BigLake-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. Wenn Sie dies vermeiden möchten, verweisen Sie beim Erstellen einer Iceberg BigLake-Tabelle auf eine BigLake-Metastore-Instanz.

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. wie 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 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 von BigLake-Iceberg-Tabellen 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:

  • Die Konfiguration copy-on-write wird unterstützt, die Konfiguration merge-on-read jedoch nicht. Weitere Informationen finden Sie unter Iceberg-Konfiguration.

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

  • Wenn Sie BigLake Metastore verwenden, gelten die folgenden Einschränkungen:

    • BigLake Metastore wird in BigQuery Omni-Regionen nicht unterstützt.
    • Beim Umbenennen einer Tabelle muss sich die Zieltabelle in derselben Datenbank wie die Quelltabelle befinden. Die Datenbank der Zieltabelle muss explizit angegeben werden.
    • Bei der Prüfung einer Iceberg-Metadatentabelle müssen Sie einen voll qualifizierten Tabellennamen verwenden. Beispiel: prod.db.table.history.

Kosten

Ihnen werden 1 TB zum On-Demand-Abfragepreis (pro TB) für alle 6.250.000 Anfragen an BigLake Metastore und für alle 625.000 in BigLake Metastore gespeicherten Objekte in Rechnung gestellt. Die Preise für On-Demand-Abfragen variieren je nach Region. Bei einer geringeren Anzahl von Anfragen oder Objekten wird Ihnen der entsprechende Anteil von 1 TB berechnet.

Wenn Sie beispielsweise 6.250.000 Anfragen an BigLake Metastore senden und darin 312.500 Objekte speichern, werden Ihnen 1,5 TB zum On-Demand-Abfragepreis für die Region berechnet, in der Sie die BigLake Metastore-Instanz erstellt haben.

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. wie 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. wie 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 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