Offene Tabellenformate mit Manifesten abfragen

In diesem Dokument wird beschrieben, wie Sie mit Manifestdateien Daten öffnen, die in offenen Tabellenformaten wie Apache Hudi und Delta Lake gespeichert sind.

Einige offene Tabellenformate wie Hudi und Delta Lake exportieren ihren aktuellen Status als eine oder mehrere Manifestdateien. Eine Manifestdatei enthält eine Liste von Datendateien, die Tabellen erstellen. Mit der Manifest-Unterstützung in BigQuery können Sie in offenen Tabellenformaten gespeicherte Daten abfragen und laden.

Hinweise

Erforderliche Rollen

Zum Abfragen von BigLake-Tabellen basierend auf Hudi- und Delta Lake-Daten benötigen Sie die folgenden Rollen:

  • BigQuery-Verbindungsnutzer (roles/bigquery.connectionUser)
  • BigQuery Datenbetrachter (roles/bigquery.dataViewer)
  • BigQuery-Nutzer (roles/bigquery.user)

Sie können auch externe Hudi-Tabellen abfragen. Wir empfehlen jedoch, ein Upgrade der externen Tabelle auf BigLake durchzuführen. Zum Abfragen externer Hudi-Tabellen benötigen Sie die folgenden Rollen:

  • BigQuery Datenbetrachter (roles/bigquery.dataViewer)
  • BigQuery-Nutzer (roles/bigquery.user)
  • Storage-Objekt-Betrachter (roles/storage.objectViewer)

Abhängig von Ihren Berechtigungen können Sie diese Rollen selbst zuweisen oder Ihren Administrator bitten, sie Ihnen zu gewähren. Weitere Informationen zum Gewähren von Rollen finden Sie unter Zuweisbare Rollen für Ressourcen aufrufen.

Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die genauen Berechtigungen anzuzeigen, die zum Abfragen von BigLake-Tabellen erforderlich sind:

Erforderliche Berechtigungen

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

Hudi-Arbeitslasten abfragen

So fragen Sie Hudi-Daten ab:

  1. Erstellen Sie eine externe Tabelle anhand von Hudi-Daten.
  2. Führen Sie ein Upgrade der externen Tabelle auf BigLake durch.

Externe Hudi-Tabellen erstellen

Wenn Sie Tabellen mithilfe des Synchronisierungstools für Hudi und BigQuery synchronisieren, aktivieren Sie das Flag use-bq-manifest-file, um zum Ansatz der Manifestdatei zu wechseln. Dieses Flag exportiert auch eine Manifestdatei in einem von BigQuery unterstützten Format und verwendet es, um eine externe Tabelle mit dem im Parameter --table angegebenen Namen zu erstellen.

So erstellen Sie eine externe Hudi-Tabelle:

  1. Um eine externe Hudi-Tabelle zu erstellen, senden Sie einen Job an einen vorhandenen Dataproc-Cluster. Aktivieren Sie beim Erstellen des Hive-BigQuery-Connectors das Flag use-bq-manifest-file, um zum Ansatz der Manifestdatei zu wechseln. Dieses Flag exportiert eine Manifestdatei in einem von BigQuery unterstützten Format und verwendet es, um eine externe Tabelle mit dem im Parameter --table angegebenen Namen zu erstellen.

    spark-submit \
       --master yarn \
       --packages com.google.cloud:google-cloud-bigquery:2.10.4 \
       --class org.apache.hudi.gcp.bigquery.BigQuerySyncTool  \
       JAR \
       --project-id PROJECT_ID \
       --dataset-name DATASET \
       --dataset-location LOCATION \
       --table TABLE \
       --source-uri URI  \
       --source-uri-prefix URI_PREFIX \
       --base-path BASE_PATH  \
       --partitioned-by PARTITION_BY \
       --use-bq-manifest-file
    

    Ersetzen Sie Folgendes:

    • JAR: Wenn Sie den Hudi-BigQuery-Connector verwenden, geben Sie hudi-gcp-bundle-0.14.0.jar an. Wenn Sie die Hudi-Komponente in Dataproc 2.1 verwenden, geben Sie /usr/lib/hudi/tools/bq-sync-tool/hudi-gcp-bundle-0.12.3.1.jar an.

    • PROJECT_ID: die Projekt-ID, in der Sie die Hudi BigLake-Tabelle erstellen möchten

    • DATASET: das Dataset, in dem Sie die Hudi BigLake-Tabelle erstellen möchten

    • LOCATION: der Ort, an dem Sie die Hudi BigLake-Tabelle erstellen möchten

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

      Wenn Sie von der früheren Version des Hudi-BigQuery-Connectors (0.13.0 und früher), die Ansichten auf die Manifestdateien erstellte, umsteigen, stellen Sie sicher, dass Sie denselben Tabellennamen verwenden, da Sie so den vorhandenen nachgelagerten Pipeline-Code beibehalten können.

    • URI: der Cloud Storage-URI, den Sie zum Speichern der Hudi-Manifestdatei erstellt haben

      Dieser URI verweist auf die Partition der ersten Ebene; achten Sie darauf, den Partitionsschlüssel anzugeben. Beispiel: gs://mybucket/hudi/mydataset/EventDate=*

    • URI_PREFIX: das Präfix für den Cloud Storage-URI-Pfad, normalerweise der Pfad zu Hudi-Tabellen

    • BASE_PATH: der Basispfad für Hudi-Tabellen

      Beispiel: gs://mybucket/hudi/mydataset/

    • PARTITION_BY: der Partitionswert

      Beispiel: EventDate

    Weitere Informationen zur Konfiguration des Connectors finden Sie unter Hud-BigQuery-Connector.

  2. Wie Sie geeignete detaillierte Steuerelemente festlegen oder die Leistung durch Aktivieren des Metadaten-Caching beschleunigen, erfahren Sie unter BigLake-Tabellen aktualisieren.

Query Delta-Arbeitslasten

Führen Sie die folgenden Schritte aus, um Delta-Workloads abzufragen:

  1. Erstellen Sie eine Manifestdatei.
  2. Erstellen Sie eine BigLake-Tabelle anhand der Manifestdatei.
  3. Legen Sie geeignete detaillierte Steuerelemente fest oder beschleunigen Sie die Leistung durch Aktivieren des Metadaten-Caching. Weitere Informationen hierzu finden Sie unter BigLake-Tabellen aktualisieren.

Manifestdatei generieren

BigQuery unterstützt die Manifestdatei in einem SymLinkTextInputFormat-Format. Dies ist eine durch Zeilenumbruch getrennte Liste von URIs. Weitere Informationen zum Generieren einer Manifestdatei finden Sie unter Integration von Presto in Delta Lake einrichten und Delta-Tabellen abfragen.

Um eine Manifestdatei zu erstellen, senden Sie einen Auftrag an einen bestehenden Dataproc-Cluster:

SQL

Führen Sie mit Spark den folgenden Befehl für eine Deltatabelle am Standort path-to-delta-table aus:

GENERATE symlink_format_manifest FOR TABLE delta.`<path-to-delta-table>`

Scala

Führen Sie mit Spark den folgenden Befehl für eine Deltatabelle am Standort path-to-delta-table aus:

val deltaTable = DeltaTable.forPath(<path-to-delta-table>)
deltaTable.generate("symlink_format_manifest")

Java

Führen Sie mit Spark den folgenden Befehl für eine Deltatabelle am Standort path-to-delta-table aus:

DeltaTable deltaTable = DeltaTable.forPath(<path-to-delta-table>);
deltaTable.generate("symlink_format_manifest");

Python

Führen Sie mit Spark den folgenden Befehl für eine Deltatabelle am Standort path-to-delta-table aus:

deltaTable = DeltaTable.forPath(<path-to-delta-table>)
deltaTable.generate("symlink_format_manifest")

Delta BigLake-Tabellen erstellen

Verwenden Sie zum Erstellen einer Delta BigLake-Tabelle die Anweisung CREATE EXTERNAL TABLE und setzen Sie das Feld file_set_spec_type auf NEW_LINE_DELIMITED_MANIFEST:

  1. Rufen Sie die Seite BigQuery auf.

    BigQuery aufrufen

  2. Führen Sie im Abfrageeditor die Anweisung CREATE EXTERNAL TABLE aus:

    CREATE EXTERNAL TABLE PROJECT_ID.DATASET_NAME.TABLE_NAME
    WITH PARTITION COLUMNS(
    `PARTITION_COLUMN PARTITION_COLUMN_TYPE`,)
    WITH CONNECTION `PROJECT_IDREGION.CONNECTION_NAME`
    OPTIONS (
       format = "DATA_FORMAT",
       uris = ["URI"],
       file_set_spec_type = 'NEW_LINE_DELIMITED_MANIFEST',
       hive_partition_uri_prefix = "PATH_TO_DELTA_TABLE"
       max_staleness = STALENESS_INTERVAL,
       metadata_cache_mode = 'CACHE_MODE');
    

    Ersetzen Sie Folgendes:

    • DATASET_NAME: der Name des von Ihnen erstellten Datasets
    • TABLE_NAME: der Name, den Sie dieser Tabelle geben möchten
    • REGION: der Standort, an dem sich die Verbindung befindet (z. B. us-east1)
    • CONNECTION_NAME: der Name der von Ihnen erstellten Verbindung
    • DATA_FORMAT: alle unterstützten Formate, z. B. PARQUET
    • URI: der Pfad zur Manifestdatei (z. B. gs://mybucket/path)
    • PATH_TO_DELTA_TABLE: ein gemeinsames Präfix für alle Quell-URIs, bevor die Codierung des Partitionierungsschlüssels beginnt
    • STALENESS_INTERVAL: gibt an, ob im Cache gespeicherte Metadaten von Vorgängen für die BigLake-Tabelle verwendet werden und wie aktuell die im Cache gespeicherten Metadaten sein müssen, damit sie vom Vorgang verwendet werden können. Weitere Informationen zu Überlegungen zum Metadaten-Caching finden Sie unter Leistungsmetadaten-Caching.

      Geben Sie 0 an, um das Caching von Metadaten zu deaktivieren. Das ist die Standardeinstellung.

      Geben Sie zum Aktivieren des Metadaten-Cachings für das Intervallliteral einen Wert zwischen 30 Minuten und 7 Tagen an. Beispiel: Geben Sie INTERVAL 4 HOUR für ein Veralterungsintervall von vier Stunden an. Mit diesem Wert verwenden Vorgänge im Zusammenhang mit der Tabelle im Cache gespeicherte Metadaten, wenn sie innerhalb der letzten vier Stunden aktualisiert wurden. Wenn die im Cache gespeicherten Metadaten älter sind, ruft der Vorgang stattdessen Metadaten aus Delta Lake ab.

    • CACHE_MODE: gibt an, ob der Metadaten-Cache automatisch oder manuell aktualisiert wird. Weitere Informationen zu Überlegungen zum Metadaten-Caching finden Sie unter Leistungsmetadaten-Caching.

      Legen Sie AUTOMATIC fest, damit der Metadaten-Cache in einem systemdefinierten Intervall aktualisiert wird, normalerweise zwischen 30 und 60 Minuten.

      Legen Sie MANUAL fest, wenn Sie den Metadaten-Cache nach einem von Ihnen bestimmten Zeitplan aktualisieren möchten. In diesem Fall können Sie den Systemvorgang BQ.REFRESH_EXTERNAL_METADATA_CACHE aufrufen, um den Cache zu aktualisieren.

      Sie müssen CACHE_MODE festlegen, wenn STALENESS_INTERVAL auf einen Wert größer als 0 festgelegt ist.

    Beispiel:

    CREATE EXTERNAL TABLE mydataset.mytable
    WITH CONNECTION `us-east1.myconnection`
    OPTIONS (
        format="PARQUET",
        uris=["gs://mybucket/path/partitionpath=*"],
        file_set_spec_type = 'NEW_LINE_DELIMITED_MANIFEST'
        hive_partition_uri_prefix = "gs://mybucket/path/"
        max_staleness = INTERVAL 1 DAY,
        metadata_cache_mode = 'AUTOMATIC'
    );
    

BigLake-Tabellen aktualisieren

Sie können die Leistung Ihrer Workloads auch beschleunigen, indem Sie die Vorteile von Metadaten-Caching und materialisierten Ansichten nutzen. Wenn Sie Metadaten-Caching verwenden möchten, können Sie gleichzeitig Einstellungen dafür festlegen. Tabellendetails wie das Quellformat und den Quell-URI finden Sie unter Tabelleninformationen abrufen.

Wählen Sie eine der folgenden Optionen, um eine externe Tabelle auf eine BigLake-Tabelle zu aktualisieren oder einen vorhandenen BigLake zu aktualisieren:

SQL

Verwenden Sie die DDL-Anweisung CREATE OR REPLACE EXTERNAL TABLE, um eine Tabelle zu aktualisieren:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Geben Sie im Abfrageeditor die folgende Anweisung ein:

    CREATE OR REPLACE EXTERNAL TABLE
      `PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME`
      WITH CONNECTION `REGION.CONNECTION_ID`
      OPTIONS(
        format ="TABLE_FORMAT",
        uris = ['BUCKET_PATH'],
        max_staleness = STALENESS_INTERVAL,
        metadata_cache_mode = 'CACHE_MODE'
        );
    

    Dabei gilt:

    • PROJECT_ID: der Name des Projekts, das die Verbindung enthält
    • DATASET: der Name des Datasets, das die Tabelle enthält
    • EXTERNAL_TABLE_NAME: der Name der Tabelle
    • REGION: die Region, die die Verbindung enthält
    • CONNECTION_ID: der Name der zu verwendenden Verbindung
    • TABLE_FORMAT: das von der Tabelle verwendete Format

      Dies kann beim Aktualisieren der Tabelle nicht geändert werden.

    • BUCKET_PATH: der Pfad zum Cloud Storage-Bucket, der die Daten für die externe Tabelle im Format ['gs://bucket_name/[folder_name/]file_name'] enthält.

      Sie können mehrere Dateien aus dem Bucket auswählen, indem Sie im Pfad ein Sternchenzeichen (*) angeben. Beispiel: ['gs://mybucket/file_name*']. Weitere Informationen finden Sie unter Unterstützung von Platzhaltern für Cloud Storage-URIs.

      Sie können mehrere Buckets für die Option uris angeben, indem Sie mehrere Pfade angeben.

      Die folgenden Beispiele zeigen gültige uris-Werte:

      • ['gs://bucket/path1/myfile.csv']
      • ['gs://bucket/path1/*.csv']
      • ['gs://bucket/path1/*', 'gs://bucket/path2/file00*']

      Wenn Sie uris-Werte angeben, die auf mehrere Dateien abzielen, müssen alle diese Dateien ein kompatibles Schema verwenden.

      Weitere Informationen zur Verwendung von Cloud Storage-URIs in BigQuery finden Sie unter Cloud Storage-Ressourcenpfad.

    • STALENESS_INTERVAL: Gibt an, ob im Cache gespeicherte Metadaten von Vorgängen für die Tabelle verwendet werden und wie aktuell die im Cache gespeicherten Metadaten sein müssen, damit der Vorgang sie verwenden kann.

      Weitere Informationen zu Überlegungen zum Metadaten-Caching finden Sie unter Leistungsmetadaten-Caching.

      Geben Sie 0 an, um das Caching von Metadaten zu deaktivieren. Das ist die Standardeinstellung.

      Geben Sie zum Aktivieren des Metadaten-Cachings für das Intervallliteral einen Wert zwischen 30 Minuten und 7 Tagen an. Beispiel: Geben Sie INTERVAL 4 HOUR für ein Veralterungsintervall von vier Stunden an. Mit diesem Wert verwenden Vorgänge im Zusammenhang mit der Tabelle im Cache gespeicherte Metadaten, wenn sie innerhalb der letzten vier Stunden aktualisiert wurden. Sind die im Cache gespeicherten Metadaten älter, werden für den Vorgang stattdessen Metadaten aus Cloud Storage abgerufen.

    • CACHE_MODE: gibt an, ob der Metadaten-Cache automatisch oder manuell aktualisiert wird.

      Weitere Informationen zu Überlegungen zum Metadaten-Caching finden Sie unter Leistungsmetadaten-Caching.

      Legen Sie AUTOMATIC fest, damit der Metadaten-Cache in einem systemdefinierten Intervall aktualisiert wird, normalerweise zwischen 30 und 60 Minuten.

      Legen Sie MANUAL fest, wenn Sie den Metadaten-Cache nach einem von Ihnen bestimmten Zeitplan aktualisieren möchten. In diesem Fall können Sie den Systemvorgang BQ.REFRESH_EXTERNAL_METADATA_CACHE aufrufen, um den Cache zu aktualisieren.

      Sie müssen CACHE_MODE festlegen, wenn STALENESS_INTERVAL auf einen Wert größer als 0 festgelegt ist.

  3. Klicken Sie auf Ausführen.

Informationen zum Ausführen von Abfragen finden Sie unter Interaktive Abfrage ausführen.

bq

Verwenden Sie die Befehle bq mkdef und bq update, um eine Tabelle zu aktualisieren:

  1. Generieren Sie eine externe Tabellendefinition, in der die Aspekte der zu ändernden Tabelle beschrieben werden:

    bq mkdef --connection_id=PROJECT_ID.REGION.CONNECTION_ID \
    --source_format=TABLE_FORMAT \
    --metadata_cache_mode=CACHE_MODE \
    "BUCKET_PATH" > /tmp/DEFINITION_FILE
    

    Dabei gilt:

    • PROJECT_ID: der Name des Projekts, das die Verbindung enthält
    • REGION: die Region, die die Verbindung enthält
    • CONNECTION_ID: Name der zu verwendenden Verbindung
    • TABLE_FORMAT: das von der Tabelle verwendete Format Dies kann beim Aktualisieren der Tabelle nicht geändert werden.
    • CACHE_MODE: gibt an, ob der Metadaten-Cache automatisch oder manuell aktualisiert wird. Weitere Informationen zu Überlegungen zum Metadaten-Caching finden Sie unter Leistungsmetadaten-Caching.

      Legen Sie AUTOMATIC fest, damit der Metadaten-Cache in einem systemdefinierten Intervall aktualisiert wird, normalerweise zwischen 30 und 60 Minuten.

      Legen Sie MANUAL fest, wenn Sie den Metadaten-Cache nach einem von Ihnen bestimmten Zeitplan aktualisieren möchten. In diesem Fall können Sie den SystemvorgangBQ.REFRESH_EXTERNAL_METADATA_CACHE aufrufen, um den Cache zu aktualisieren.

      Sie müssen CACHE_MODE festlegen, wenn STALENESS_INTERVAL auf einen Wert größer als 0 festgelegt ist.

    • BUCKET_PATH: der Pfad zum Cloud Storage-Bucket, der die Daten für die externe Tabelle im Format gs://bucket_name/[folder_name/]file_name enthält.

      Sie können die aus dem Bucket ausgewählten Dateien einschränken, indem Sie im Pfad ein Sternchenzeichen (*) angeben. Beispiel: gs://mybucket/file_name*. Weitere Informationen finden Sie unter Unterstützung von Platzhaltern für Cloud Storage-URIs.

      Sie können mehrere Buckets für die Option uris angeben, indem Sie mehrere Pfade angeben.

      Die folgenden Beispiele zeigen gültige uris-Werte:

      • gs://bucket/path1/myfile.csv
      • gs://bucket/path1/*.csv
      • gs://bucket/path1/*,gs://bucket/path2/file00*

      Wenn Sie uris-Werte angeben, die auf mehrere Dateien abzielen, müssen alle diese Dateien ein kompatibles Schema verwenden.

      Weitere Informationen zur Verwendung von Cloud Storage-URIs in BigQuery finden Sie unter Cloud Storage-Ressourcenpfad.

    • DEFINITION_FILE: der Name der Tabellendefinitionsdatei, die Sie erstellen.

  2. Aktualisieren Sie die Tabelle mit der neuen externen Tabellendefinition:

    bq update --max_staleness=STALENESS_INTERVAL \
    --external_table_definition=/tmp/DEFINITION_FILE \
    PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME
    

    Ersetzen Sie Folgendes:

    • STALENESS_INTERVAL: Gibt an, ob im Cache gespeicherte Metadaten von Vorgängen für die Tabelle verwendet werden und wie aktuell die im Cache gespeicherten Metadaten sein müssen, damit der Vorgang sie verwenden kann. Weitere Informationen zu Überlegungen zum Metadaten-Caching finden Sie unter Leistungsmetadaten-Caching.

      Geben Sie 0 an, um das Caching von Metadaten zu deaktivieren. Das ist die Standardeinstellung.

      Geben Sie zum Aktivieren des Metadaten-Cachings einen Intervallwert zwischen 30 Minuten und 7 Tagen unter Verwendung des in der INTERVAL-Datentypdokumentation beschriebenen Formats Y-M D H:M:S. Beispiel: Geben Sie 0-0 0 4:0:0 für ein Veralterungsintervall von vier Stunden an. Mit diesem Wert verwenden Vorgänge im Zusammenhang mit der Tabelle im Cache gespeicherte Metadaten, wenn sie innerhalb der letzten vier Stunden aktualisiert wurden. Sind die im Cache gespeicherten Metadaten älter, werden für den Vorgang stattdessen Metadaten aus Cloud Storage abgerufen.

    • DEFINITION_FILE: der Name der Tabellendefinitionsdatei, die Sie erstellt oder aktualisiert haben.

    • PROJECT_ID: der Name des Projekts, das die Verbindung enthält

    • DATASET: der Name des Datasets, das die Tabelle enthält

    • EXTERNAL_TABLE_NAME: der Name der Tabelle

BigLake und externe Tabellen abfragen

Nachdem Sie eine BigLake-Tabelle erstellt haben, können Sie sie mit der GoogleSQL-Syntax abfragen, so als wäre sie eine Standard-BigQuery-Tabelle. Beispiel: SELECT field1, field2 FROM mydataset.my_cloud_storage_table;.

Beschränkungen

  • BigQuery unterstützt nur die Abfrage von Delta Lake-Leser v1-Tabellen.

  • Die Einbindung von Hudi und BigQuery funktioniert nur für partitionierte copy-on-write-Tabellen im Hive-Stil.

  • Die Verwendung von Manifesten zum Abfragen von Daten, die im Drittanbieterspeicher gespeichert sind, wird nicht unterstützt.

Nächste Schritte