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
Enable the BigQuery Connection, BigQuery Reservation, and BigLake APIs.
Führen Sie die Spark-Befehle mit einer der folgenden Methoden aus, um BigLake-Tabellen zu erstellen:
Dataproc-Cluster erstellen. Zum Abfragen von Hudi-Tabellen setzen Sie das Feld
--optional-components
aufHUDI
. Zum Abfragen von Deltatabellen setzen Sie das Feld--optional-components
aufPresto
.Verwenden Sie eine gespeicherte Prozedur für Spark in BigQuery. Führen Sie dazu die folgenden Schritte aus:
Zum Speichern der Manifestdatei in Cloud Storage erstellen Sie einen Cloud Storage-Bucket. Sie müssen eine Verbindung zu Ihrem Cloud Storage-Bucket herstellen, um auf die Manifestdatei zuzugreifen. Führen Sie dazu die folgenden Schritte aus:
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
bigquery.connections.use
bigquery.jobs.create
bigquery.readsessions.create
(Nur erforderlich, wenn Sie Daten mit der BigQuery Storage Read API lesen)bigquery.tables.get
bigquery.tables.getData
Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.
Hudi-Arbeitslasten abfragen
- Erstellen Sie eine externe Tabelle anhand von Hudi-Daten.
- 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:
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 Siehudi-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öchtenDATASET
: das Dataset, in dem Sie die Hudi BigLake-Tabelle erstellen möchtenLOCATION
: der Ort, an dem Sie die Hudi BigLake-Tabelle erstellen möchtenTABLE
: der Name der Tabelle, die Sie erstellen möchtenWenn 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 habenDieser 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-TabellenBASE_PATH
: der Basispfad für Hudi-TabellenBeispiel:
gs://mybucket/hudi/mydataset/
PARTITION_BY
: der PartitionswertBeispiel:
EventDate
Weitere Informationen zur Konfiguration des Connectors finden Sie unter Hud-BigQuery-Connector.
Wie Sie geeignete detaillierte Steuerelemente festlegen oder die Leistung durch Aktivieren des Metadaten-Caching beschleunigen, erfahren Sie unter BigLake-Tabellen aktualisieren.
Query Delta-Arbeitslasten
Deltatabellen werden jetzt nativ unterstützt. Wir empfehlen, Delta BigLake-Tabellen für Delta-Arbeitslasten zu erstellen. Delta Lake BigLake-Tabellen unterstützen erweiterte Delta Lake-Tabellen, einschließlich Tabellen mit Spaltenneuzuordnungs- und Löschvektoren. Darüber hinaus lesen Delta BigLake-Tabellen den neuesten Snapshot direkt, sodass Aktualisierungen sofort verfügbar sind.
Führen Sie die folgenden Schritte aus, um Delta-Workloads abzufragen:
- Erstellen Sie eine Manifestdatei.
- Erstellen Sie eine BigLake-Tabelle anhand der Manifestdatei.
- 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
:
Rufen Sie die Seite BigQuery auf.
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 DatasetsTABLE_NAME
: der Name, den Sie dieser Tabelle geben möchtenREGION
: der Standort, an dem sich die Verbindung befindet (z. B.us-east1
)CONNECTION_NAME
: der Name der von Ihnen erstellten VerbindungDATA_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 beginntSTALENESS_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 SystemvorgangBQ.REFRESH_EXTERNAL_METADATA_CACHE
aufrufen, um den Cache zu aktualisieren.Sie müssen
CACHE_MODE
festlegen, wennSTALENESS_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:
Öffnen Sie in der Google Cloud Console die Seite BigQuery.
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ältDATASET
: der Name des Datasets, das die Tabelle enthältEXTERNAL_TABLE_NAME
: der Name der TabelleREGION
: die Region, die die Verbindung enthältCONNECTION_ID
: der Name der zu verwendenden VerbindungTABLE_FORMAT
: das von der Tabelle verwendete FormatDies 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 SystemvorgangBQ.REFRESH_EXTERNAL_METADATA_CACHE
aufrufen, um den Cache zu aktualisieren.Sie müssen
CACHE_MODE
festlegen, wennSTALENESS_INTERVAL
auf einen Wert größer als 0 festgelegt ist.
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:
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ältREGION
: die Region, die die Verbindung enthältCONNECTION_ID
: Name der zu verwendenden VerbindungTABLE_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, wennSTALENESS_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 Formatgs://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.
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 FormatsY-M D H:M:S
. Beispiel: Geben Sie0-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ältDATASET
: der Name des Datasets, das die Tabelle enthältEXTERNAL_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
- SQL in BigQuery verwenden
- Informationen zu BigLake-Tabellen.
- BigQuery-Kontingente