Externe BigLake-Tabellen für Delta Lake erstellen

Mit BigLake können Sie über eine detaillierte Zugriffssteuerung auf Delta Lake-Tabellen zugreifen. Delta Lake ist ein von Databricks entwickeltes Open-Source-Tabellenformat zur Speicherung tabellarischer Daten, das Datentabellen im Petabytebereich unterstützt.

BigQuery unterstützt die folgenden Funktionen mit Delta Lake-Tabellen:

  • Zugriffsdelegation: Fragen Sie strukturierte Daten in externen Datenspeichern mit Zugriffsdelegation ab. Durch die Zugriffsdelegation wird der Zugriff auf die Delta Lake-Tabelle vom Zugriff auf den zugrunde liegenden Datenspeicher entkoppelt.
  • Detaillierte Zugriffssteuerung: Detaillierte Sicherheit auf Tabellenebene erzwingen, einschließlich Sicherheit auf Zeilenebene und Spaltenebene. Für Delta Lake-Tabellen, die auf Cloud Storage basieren, können Sie auch die dynamische Datenmaskierungverwenden.
  • Schemaentwicklung: Schemaänderungen in den Delta Lake-Tabellen werden automatisch erkannt. Änderungen am Schema werden in die BigQuery-Tabelle übernommen.

Delta Lake-Tabellen unterstützen alle BigLake-Features, wenn Sie sie als BigLake-Tabellen konfigurieren.

Hinweis

  1. Wählen Sie in der Google Cloud Console auf der Seite für die Projektauswahl ein Projekt aus oder erstellen Sie eines. Google Cloud

    Rollen, die zum Auswählen oder Erstellen eines Projekts erforderlich sind

    • Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können ein beliebiges Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
    • Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“ (roles/resourcemanager.projectCreator), die die resourcemanager.projects.create Berechtigung enthält. Informationen zum Zuweisen von Rollen.

    Zur Projektauswahl

  2. Prüfen Sie, ob für Ihr Google Cloud Projekt die Abrechnung aktiviert ist.

  3. Aktivieren Sie die BigQuery Connection API und die BigQuery Reservation API.

    Rollen, die zum Aktivieren von APIs erforderlich sind

    Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) mit der Berechtigung serviceusage.services.enable. Informationen zum Zuweisen von Rollen.

    APIs aktivieren

  4. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

  5. Sorgen Sie dafür, dass Sie ein BigQuery Dataset haben.

  6. Prüfen Sie, ob Ihre Version des Google Cloud SDK 366.0.0 oder höher ist:

    gcloud version
    

    Aktualisieren Sie das Google Cloud SDK bei Bedarf.

  7. Erstellen Sie eine Cloud-Ressourcenverbindung anhand der externen Datenquelle und gewähren Sie dieser Verbindung Zugriff auf Cloud Storage. Wenn Sie nicht die erforderlichen Berechtigungen zum Erstellen einer Verbindung haben, bitten Sie Ihren BigQuery-Administrator, eine Verbindung zu erstellen und die Verbindung mit Ihnen zu teilen.

Erforderliche Rollen

Die folgenden Berechtigungen sind zum Erstellen einer Delta Lake-Tabelle erforderlich:

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

Die vordefinierte IAM-Rolle „Identity and Access Management“ (BigQuery) (roles/bigquery.admin) enthält diese Berechtigungen.

Wenn Sie in dieser Rolle kein Hauptkonto darstellen, bitten Sie Ihren Administrator, Ihnen diese Berechtigungen zu gewähren oder die Delta Lake-Tabelle für Sie zu erstellen.

Darüber hinaus muss das mit der Verbindung verknüpfte Dienstkonto die folgende Berechtigung und den folgenden Zugriff haben, damit BigQuery-Nutzer die Tabelle abfragen können:

  • Rolle „BigQuery-Betrachter“ (roles/bigquery.viewer)
  • Rolle „BigQuery-Verbindungsnutzer“ (roles/bigquery.connectionUser)
  • Zugriff auf den Cloud Storage-Bucket, der diese Daten enthält

Weitere Informationen zu Rollen und Berechtigungen für das Identity and Access Management in BigQuery finden Sie unter Vordefinierte Rollen und Berechtigungen.

Tabellen mit Delta Lake erstellen

So erstellen Sie Delta Lake-Tabellen:

SQL

Verwenden Sie die CREATE EXTERNAL TABLE Anweisung um die Delta Lake-Tabelle zu erstellen:

CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.DELTALAKE_TABLE_NAME`
WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
OPTIONS (
  format ="DELTA_LAKE",
  uris=['DELTA_TABLE_GCS_BASE_PATH']);

Ersetzen Sie die folgenden Werte:

bq

Verwenden Sie in einer Befehlszeilenumgebung den bq mk Befehl um die Delta Lake-Tabelle zu erstellen:

bq mk --table --external_table_definition=DEFINITION_FILE PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

Ersetzen Sie die folgenden Werte:

  • DEFINITION_FILE: der Pfad zur Tabellendefinitionsdatei.
  • PROJECT_ID: ID des Projekts, in dem Sie die Delta Lake-Tabelle erstellen möchten
  • DATASET: BigQuery-Dataset, das die Delta Lake-Tabelle enthalten soll
  • DELTALAKE_TABLE_NAME: Name Ihrer Delta Lake-Tabelle

REST

Verwenden Sie die BigQuery API, um eine Delta Lake-Tabelle durch den Aufruf der API-Methode tables.insert zu erstellen:

REQUEST='{
  "autodetect": true,
  "externalDataConfiguration": {
  "sourceFormat": "DELTA_LAKE",
  "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
  "sourceUris": [
    "DELTA_TABLE_GCS_BASE_PATH"
  ],
 },
"tableReference": {
"tableId": "DELTALAKE_TABLE_NAME"
}
}'

echo $REQUEST | curl -X POST -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables?autodetect_schema=true

Ersetzen Sie die folgenden Werte:

Wenn Sie Delta Lake-Tabellen erstellen, wird das Delta Lake-Präfix als URI für die Tabelle verwendet. Für eine Tabelle mit Logs im Bucket gs://bucket/warehouse/basictable/_delta_log lautet der Tabellen-URI beispielsweise gs://bucket/warehouse/basictable. Wenn Sie Abfragen für die Delta Lake-Tabelle ausführen, liest BigQuery Daten unter dem Präfix um die aktuelle Version der Tabelle zu ermitteln. Anschließend werden die Metadaten und die Dateien für die Tabelle berechnet.

Sie können zwar externe Delta Lake-Tabellen ohne Verbindung erstellen, dies wird jedoch aus den folgenden Gründen nicht empfohlen:

  • Nutzer erhalten möglicherweise ACCESS_DENIED-Fehler, wenn sie versuchen, auf Dateien in Cloud Storage zuzugreifen.
  • Funktionen wie die detaillierte Zugriffssteuerung sind nur in Delta Lake BigLake-Tabellen verfügbar.

Delta Lake-Tabellen aktualisieren

So aktualisieren (erfrischen) Sie das Schema von Delta Lake-Tabellen:

bq

Verwenden Sie in einer Befehlszeilenumgebung den Befehl bq update, um das Schema der Delta Lake-Tabelle zu aktualisieren (aufzufrischen):

bq update --autodetect_schema PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

Ersetzen Sie die folgenden Werte:

  • PROJECT_ID: ID des Projekts, in dem Sie die Delta Lake-Tabelle erstellen möchten
  • DATASET: BigQuery-Dataset, das die Delta Lake-Tabelle enthalten soll
  • DELTALAKE_TABLE_NAME: Name Ihrer Delta Lake-Tabelle

REST

Verwenden Sie die BigQuery API, um eine Delta Lake-Tabelle durch den Aufruf der API-Methode tables.patch zu aktualisieren:

REQUEST='{
  "externalDataConfiguration": {
    "sourceFormat": "DELTA_LAKE",
    "sourceUris": [
      "DELTA_TABLE_GCS_BASE_PATH"
    ],
    "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
    "autodetect": true
  }
}'
echo $REQUEST |curl -X PATCH -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/DELTALAKE_TABLE_NAME?autodetect_schema=true

Ersetzen Sie die folgenden Werte:

Delta Lake-Tabellen abfragen

Nachdem Sie eine Delta Lake 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;

Weitere Informationen finden Sie unter Cloud Storage-Daten in BigLake-Tabellen abfragen.

Für den Verbindungsaufbau zum Datenspeicher wird eine externe Verbindung verwendet, die mit einem Dienstkonto verknüpft ist. Da das Dienstkonto Daten aus dem Datenspeicher abruft, benötigen Nutzer nur Zugriff auf die Delta Lake-Tabelle.

Datenabgleich

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

Delta Lake-Typ BigQuery-Typ
boolean BOOL
byte INT64
int INT64
long INT64
float FLOAT64
double FLOAT64
Decimal(P/S) NUMERIC oder BIG_NUMERIC, je nach Precision
date DATE
time TIME
timestamp (not partition column) TIMESTAMP
timestamp (partition column) DATETIME
string STRING
binary BYTES
array<Type> ARRAY<Type>
struct STRUCT
map<KeyType, ValueType> ARRAY<Struct<key KeyType, value ValueType>>

Beschränkungen

Für Delta Lake-Tabellen gelten BigLake-Tabelleneinschränkungen sowie die folgenden Einschränkungen:

  • Unterstützt die Delta Lake Leserversion 3 mit Löschvektoren für relative Pfade und Spaltenzuordnung.
  • Unterstützt keine Delta Lake V2-Prüfpunkte.
  • Sie müssen die Leserversion in der letzten Logeintragsdatei auflisten. Neue Tabellen müssen beispielsweise 00000..0.json enthalten.
  • Vorgänge zur Erfassung von Datenänderungen (Change Data Capture, CDC) werden nicht unterstützt. Vorhandene CDC-Vorgänge werden ignoriert.
  • Das Schema wird automatisch erkannt. Das Ändern des Schemas mit BigQuery wird nicht unterstützt.
  • Tabellenspaltennamen müssen den Beschränkungen für BigQuery Spaltennamen entsprechen.
  • Materialisierte Ansichten werden nicht unterstützt.
  • Die Read API wird für Delta Lake nicht unterstützt.
  • Der Datentyp timestamp_ntz wird für Delta Lake BigLake-Tabellen nicht unterstützt.

Fehlerbehebung

In diesem Abschnitt finden Sie Hilfe zu Delta Lake BigLake-Tabellen. Allgemeinere Hilfe zur Fehlerbehebung bei BigQuery-Abfragen finden Sie unter siehe Probleme mit Abfragen beheben.

Zeitüberschreitung bei Abfragen und Ressourcenfehler

Prüfen Sie das Logverzeichnis (gs://bucket/warehouse/basictable/_delta_log) der Delta Lake-Tabelle und suchen Sie nach JSON-Dateien mit einer Versionsnummer, die höher als der vorherige Prüfpunkt ist. Sie können die Versionsnummer abrufen, indem Sie das Verzeichnis auflisten oder die Datei „_delta_log/_last_checkpoint“ prüfen. JSON-Dateien, die größer als 10 MiB sind, können die Tabellenerweiterung verlangsamen, was zu Zeitüberschreitungen und Ressourcenproblemen führen kann. Verwenden Sie den folgenden Befehl, um dieses Problem zu beheben und einen neuen Prüfpunkt zu erstellen, damit Abfragen das Lesen der JSON-Dateien überspringen:

  spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.checkpointInterval' = '1')");

Nutzer können dann mit demselben Befehl das Prüfpunktintervall entweder auf den Standardwert 10 oder auf einen Wert zurücksetzen, der verhindert, dass zwischen den Prüfpunkten mehr als 50 MB an JSON-Dateien vorhanden sind.

Ungültiger Spaltenname

Achten Sie darauf, dass die Spaltenzuordnung für die Delta Lake-Tabelle aktiviert ist. Die Spaltenzuordnung wird ab Leserversion 2 unterstützt. Legen Sie für Leserversion 1 mit dem folgenden Befehl „delta.columnMapping.mode“ auf „name“ fest:

spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.columnMapping.mode' = 'name', 'delta.minReaderVersion' = '3', 'delta.minWriterVersion' = '7')");

Wenn der ungültige Spaltenname den Beschränkungen für flexible Spaltennamen entspricht, wenden Sie sich an den Cloud Customer Care oder an biglake-help@google.com.

Fehler „Zugriff verweigert“

So diagnostizieren Sie Probleme mit Delta Lake BigLake-Tabellen:

Leistung

So verbessern Sie die Abfrageleistung:

  • Verwenden Sie Delta Lake-Dienstprogramme, um die zugrunde liegenden Datendateien zu komprimieren und redundante Dateien wie Daten und Metadaten zu entfernen.

  • Achten Sie darauf, dass delta.checkpoint.writeStatsAsStruct auf true gesetzt ist.

  • Achten Sie darauf, dass Variablen, die häufig in Prädikatklauseln verwendet werden, in Partitionierungsspalten enthalten sind.

Bei großen Datasets (über 100 TB) sind möglicherweise zusätzliche Konfigurationen und Funktionen erforderlich. Wenn sich Ihre Probleme mit den vorherigen Schritten nicht beheben lassen, wenden Sie sich an den Kundensupport oder an biglake-help@google.com, insbesondere bei Datasets, die größer als 100 TB sind.