Apache Iceberg-Tabellen abfragen

Autonomous Database unterstützt das Abfragen von Apache Iceberg-Tabellen.

Informationen zum Abfragen von Apache Iceberg-Tabellen

Autonomous Database unterstützt das Abfragen von Apache Iceberg-Tabellen, die in Amazon Web Services (AWS) oder in Oracle Cloud Infrastructure (OCI) Object Storage gespeichert sind.

Unterstützte Konfigurationen

Diese spezifischen Konfigurationen werden unterstützt:

Einschränkungen

  • Partitionierte Iceberg-Tabellen

    Oracle unterstützt keine Iceberg-partitionierten Tabellen.

  • Aktualisierungen von Iceberg-Tabellen auf Zeilenebene

    Oracle unterstützt keine Merge-on-Read-Funktion für Iceberg-Tabellenaktualisierungen. Abfragen, die auf gelöschte Dateien in den Iceberg-Metadaten stoßen, verlaufen nicht erfolgreich. Weitere Informationen zum Lesen der Zusammenführung finden Sie unter Enum RowLevelOperationMode.

  • Schemaentwicklung

    Das Schema für externe Oracle-Tabellen ist fest und spiegelt die Iceberg-Schemaversion zum Zeitpunkt der externen Tabellenerstellung wider. Abfragen sind nicht erfolgreich, wenn die Iceberg-Metadaten auf eine andere Schemaversion verweisen als die zum Erstellen der Iceberg-Tabelle verwendete. Wenn sich das Iceberg-Schema nach dem Erstellen der externen Tabelle ändert, wird empfohlen, die externe Tabelle neu zu erstellen.

Konzepte zum Abfragen von Apache Iceberg-Tabellen

Die folgenden Konzepte sind für die Abfrage von Apache Iceberg-Tabellen hilfreich.

Iceberg-Katalog

Der Iceberg-Katalog ist ein Service, der Tabellenmetadaten wie Tabellen-Snapshots, das Tabellenschema und Partitionierungsinformationen verwaltet. Um den neuesten Snapshot für eine Iceberg-Tabelle abzufragen, müssen Abfrage-Engines zuerst auf den Katalog zugreifen und den Speicherort der neuesten Metadatendatei abrufen. Es gibt bereits eine Reihe verfügbarer Katalogimplementierungen, darunter AWS Glue, Hive, Nessie und Hadoop. Autonomous Database unterstützt den AWS Glue-Katalog und die HadoopCatalog-Implementierung, die von Spark verwendet wird.

Weitere Informationen finden Sie unter Optimistische Nebenläufigkeit.

Metadaten-Dateien

Die Metadatendatei ist ein JSON-Dokument, das die Tabellen-Snapshots, das Partitionierungsschema und die Schemainformationen verfolgt. Die Metadatendatei ist der Einstiegspunkt in eine Hierarchie aus Manifestlisten und Manifestdateien. Die Manifeste verfolgen die Datendateien der Tabelle zusammen mit Informationen wie Partitionierung und Spaltenstatistiken. Weitere Informationen finden Sie in der Eisberg-Tabellenspezifikation.

Transaktionen

Iceberg unterstützt Aktualisierungen auf Zeilenebene für Tabellen entweder mit Copy-on-Write oder Merge-on-Read. Copy-on-Write generiert neue Datendateien, die den aktualisierten Zeilen entsprechen, während Merge-on-Read neue "Löschdateien" generiert, die beim Lesen mit den Datendateien zusammengeführt werden müssen. Oracle unterstützt Copy-on-Write. Abfragen an Eisbergtabellen sind nicht erfolgreich, wenn sie auf eine Löschdatei stoßen. Weitere Informationen finden Sie in RowLevelOperationMode.

Schemaentwicklung

Iceberg unterstützt die Schemaentwicklung. Schemaänderungen werden mit einer Schema-ID in den Iceberg-Metadaten widergespiegelt. Beachten Sie, dass externe Oracle-Tabellen ein festes Schema aufweisen, das von der aktuellsten Schemaversion zum Zeitpunkt der Tabellenerstellung bestimmt wird. Iceberg-Abfragen sind nicht erfolgreich, wenn die abgefragten Metadaten auf eine andere Schemaversion verweisen als die bei der Tabellenerstellung verwendete. Weitere Informationen finden Sie in Schemaentwicklung.

Partitionierung

Iceberg unterstützt erweiterte Partitionierungsoptionen wie versteckte Partitionierung und Partitionsentwicklung, die auf der Verarbeitung/Änderung der Metadaten der Tabelle ohne kostspielige Änderungen des Datenlayouts basieren.

Beispiele: Abfragen von Apache Iceberg-Tabellen

Diese Beispiele zeigen, wie Sie Apache Iceberg-Tabellen in Amazon Web Services (AWS) und Oracle Cloud Infrastructure (OCI) mit einem Datenkatalog abfragen und direkte URLs für die Root-Manifestdatei verwenden.

Ausführliche Informationen zum Erstellen externer Tabellen für Apache Iceberg finden Sie unter Prozedur CREATE_EXTERNAL_TABLE für Apache Iceberg.

Iceberg-Tabelle auf AWS mit einem Glue-Datenkatalog abfragen

In diesem Beispiel fragen wir die Iceberg-Tabelle ab: iceberg_parquet_time_dim.Beschreibung von example_1_table.png folgt
Beschreibung der Abbildung example_1_table.png

Die Tabelle gehört zur Glue-Datenbank my-iceberg-db und wird im Ordner s3://my-iceberg-bucket/iceberg-loc gespeichert.

Die Tabellendetails für iceberg_parquet_time_dim werden hier angezeigt:

Eine Beschreibung von example_1_details_v1.png folgt.
Beschreibung der Abbildung example_1_details_v1.png

Sie können eine externe Tabelle für iceberg_parquet_time_dim wie folgt erstellen:

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name       => 'iceberg_parquet_time_dim',
    credential_name  => 'AWS_CRED',
    file_uri_list    => '',
    format           =>
      '{"access_protocol":
        {
         "protocol_type": "iceberg",
         "protocol_config":
          {
           "iceberg_catalog_type": "aws_glue",
           "iceberg_glue_region": "us-west-1",
           "iceberg_table_path": "my-iceberg-db.iceberg_parquet_time_dim"
          }
        }
      }'
  );
END;
/

Im Abschnitt protocol_config geben Sie an, dass die Tabelle AWS Glue als Katalogtyp verwendet und die Region des Katalogs auf us-west-1 gesetzt wird.

Die Zugangsdaten AWS_CRED werden mit dbms_cloud.create_credential mit einem AWS-API-Schlüssel erstellt. Die Instanz des Leimdatenkatalogs wird durch die Account-ID bestimmt, die mit AWS_CRED für Region us-west-1 verknüpft ist, da für jeden Account ein einzelner Bereich des Leimdatenkatalogs vorhanden ist. Das Element iceberg_table_path im Abschnitt protocol_config verwendet einen $database_name.$table_name-Pfad, um den Namen der Glue-Tabelle und den Datenbanknamen anzugeben. Schließlich werden die Parameter column_list und field_list nicht angegeben, weil das Schema der Tabelle automatisch aus den Iceberg-Metadaten abgeleitet wird.

Weitere Informationen zum Erstellen der Zugangsdaten finden Sie unter CREATE_CREDENTIAL-Prozedur. Informationen zu AWS Glue-Ressourcen finden Sie unter Angeben von AWS Glue-Ressourcen-ARNs.

Abfragen einer Iceberg-Tabelle auf AWS mit dem Speicherort der Root-Metadatendatei

Wenn wir den Speicherort der Metadatendatei für eine Iceberg-Tabelle kennen, können wir wie folgt eine externe Tabelle erstellen, ohne einen Katalog anzugeben:

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name       => 'iceberg_parquet_time_dim',
    credential_name  => 'AWS_CRED',
    file_uri_list    => 'https://my-iceberg-bucket.s3.us-west-1.amazonaws.com/iceberg-loc/metadata/00004-1758ee2d-a204-4fd9-8d52-d17e5371a5ce.metadata.json',
    format           =>'{"access_protocol":{"protocol_type":"iceberg"}}');
END;
/

Mit dem Parameter file_uri_list geben Sie den Speicherort der Metadatendatei im URL-Format S3 im virtuellen gehosteten AWS-Stil an. Informationen zu diesem Format finden Sie unter Methoden für den Zugriff auf einen AWS S3-Bucket.

In diesem Beispiel greift die Datenbank direkt auf die Metadatendatei zu. Daher muss im Parameter format kein Abschnitt protocol_config angegeben werden. Wenn Sie den Speicherort der Metadatendatei zum Erstellen einer externen Tabelle verwenden, fragt die Datenbank den zuletzt von der Metadatendatei referenzierten Snapshot ab. Nachfolgende Aktualisierungen der Iceberg-Tabelle, die neue Snapshots und neue Metadatendateien erstellen, sind für die Datenbank nicht sichtbar.

Iceberg-Tabelle abfragen, die Hadoop Catalog auf OCI verwendet

In diesem Beispiel wird die Iceberg-Tabelle icebergTablePy abgefragt, die mit OCI Data Flow erstellt wurde. Dabei verwendet Spark die Implementierung HadoopCatalog für den Iceberg-Katalog. HadoopCatalog verwendet ein Verzeichnis warehouse und platziert die Iceberg-Metadaten in einem Unterordner $database_name/$table_name unter diesem Verzeichnis. Außerdem wird eine version-hint.text-Datei verwendet, die die Versionsnummer für die neueste Metadatendateiversion enthält. Siehe Iceberg Support on OCI Data Flow für das Beispiel auf Github.

Die Beispieltabelle db.icebergTablePy wurde mit einem warehouse-Ordner namens iceberg im OCI-Bucket my-iceberg-bucket erstellt. Das Speicherlayout auf OCI für Tabelle icebergTablePy wird unten angezeigt:

Eine Beschreibung von example_3_table_v1.png folgt.
Beschreibung der Abbildung example_3_table_v1.png

Erstellen Sie wie folgt eine externe Tabelle für Tabelle db.icebergTablePy:

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name       => 'iceberg_parquet_time_dim3',
    credential_name  => 'OCI_CRED',
    file_uri_list    => '',
    format           =>'{"access_protocol":{"protocol_type":"iceberg",
        "protocol_config":{"iceberg_catalog_type": "hadoop",
        "iceberg_warehouse":"https://objectstorage.uk-cardiff-1.oraclecloud.com/n/my-tenancy/b/my-iceberg-bucket/o/iceberg",
        "iceberg_table_path": "db.icebergTablePy"}}}');
END;
/

Iceberg-Tabelle auf OCI mit dem Speicherort der Root-Metadatendatei abfragen

Sie können die im vorherigen Abschnitt beschriebene Iceberg-Tabelle wie folgt direkt mit der URL für die Metadatendatei abfragen:

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name       => 'iceberg_parquet_time_dim4',
    credential_name  => 'OCI_CRED',
    file_uri_list    => 'https://objectstorage.uk-cardiff-1.oraclecloud.com/n/my-tenancy/b/my-iceberg-bucket/o/iceberg/db/icebergTablePy/metadata/v2.metadata.json',
    format           =>'{"access_protocol":{"protocol_type":"iceberg"}}'
    );
  END;
/

In diesem Beispiel verwenden wir den Parameter file_uri_list, um die URI für die Metadatendatei mit dem nativen OCI-URI-Format anzugeben. Wenn Sie den URI der Metadatendatei verwenden, fragt die externe Tabelle immer den neuesten Snapshot ab, der in der spezifischen Datei gespeichert ist. Nachfolgende Aktualisierungen, die neue Snapshots und neue Metadatendateien generieren, sind für die Abfrage nicht zugänglich.

Weitere Informationen zum nativen OCI-URI-Format finden Sie unter URI-Formate für Cloud-Objektspeicher.