Zugreifen auf Amazon-S3-Tabellen mit dem Amazon-S3-Tables-Katalog für Apache Iceberg - Amazon Simple Storage Service

Zugreifen auf Amazon-S3-Tabellen mit dem Amazon-S3-Tables-Katalog für Apache Iceberg

Sie können mit Open-Source-Abfrage-Engines wie Apache Spark auf S3 Tables zugreifen, indem Sie den Katalog von Amazon S3 Tables für den Client-Katalog von Apache Iceberg verwenden. Der Katalog von Amazon S3 Tables für Apache Iceberg ist eine Open-Source-Bibliothek, die von AWS-Übungen gehostet wird. Sie übersetzt Apache Iceberg-Operationen in Ihren Abfrage-Engines (wie etwa das Erkennen von Tabellen, das Aktualisieren von Metadaten oder das Hinzufügen und Entfernen von Tabellen) in API-Operationen für S3 Tables.

Der Katalog von Amazon S3 Tables für Apache Iceberg wird als Maven JAR mit dem Namen s3-tables-catalog-for-iceberg.jar vertrieben. Sie können die JAR des Client-Katalogs selbst aus dem AWS Labs GitHub-Repository erstellen oder sie direkt aus Maven herunterladen. Wenn Sie eine Verbindung zu Tabellen herstellen, wird der Client-Katalog JAR als Abhängigkeit verwendet, wenn Sie eine Spark-Sitzung für Apache Iceberg initialisieren.

Verwenden des Amazon-S3-Tables-Katalog für Apache Iceberg mit Apache Spark

Sie können den Amazon S3 Tables Catalog für den Apache Iceberg-Client-Katalog verwenden, um eine Verbindung mit Tabellen aus Open-Source-Anwendungen herzustellen, wenn Sie eine Spark-Sitzung initialisieren. In Ihrer Sitzungskonfiguration geben Sie Iceberg und Amazon-S3-Abhängigkeiten an und erstellen einen benutzerdefinierten Katalog, der Ihren Tabellen-Bucket als Metadaten-Warehouse verwendet.

Voraussetzungen
So initialisieren Sie eine Spark Sitzung mit dem Amazon S3 Tables Catalog für Apache Iceberg
  • Initialisieren Sie Spark mit dem folgenden Befehl. Um den Befehl zu verwenden, ersetzen Sie den Amazon S3 Tables Catalog für die Apache Iceberg-Versionsnummer durch die neueste Version aus dem AWS Labs GitHub-Repository und den Tabellen-Bucket-ARN durch Ihren eigenen Tabellen-Bucket-ARN.

    spark-shell \ --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1,software.amazon.s3tables:s3-tables-catalog-for-iceberg-runtime:0.1.4 \ --conf spark.sql.catalog.s3tablesbucket=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.s3tablesbucket.catalog-impl=software.amazon.s3tables.iceberg.S3TablesCatalog \ --conf spark.sql.catalog.s3tablesbucket.warehouse=arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

Abfragen von S3 Tables mit Spark

Mit Spark können Sie DQL-, DML- und DDL-Operationen in S3 Tables ausführen. Wenn Sie Tabellen abfragen, verwenden Sie den vollqualifizierten Tabellennamen, einschließlich des Sitzungskatalognamens, nach diesem Muster:

CatalogName.NamespaceName.TableName

Die folgenden Beispielabfragen zeigen einige Möglichkeiten, wie Sie mit S3 Tables interagieren können. Um diese Beispielabfragen in Ihrer Abfrage-Engine zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Werte:

So fragen Sie Tabellen mit Spark ab
  • Namespaces erstellen

    spark.sql(" CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.my_namespace")
  • Erstellen einer Tabelle

    spark.sql(" CREATE TABLE IF NOT EXISTS s3tablesbucket.my_namespace.`my_table` ( id INT, name STRING, value INT ) USING iceberg ")
  • Tabellen abfragen

    spark.sql(" SELECT * FROM s3tablesbucket.my_namespace.`my_table` ").show()
  • Einfügen von Datenzeilen in eine Tabelle

    spark.sql( """ INSERT INTO s3tablesbucket.my_namespace.my_table VALUES (1, 'ABC', 100), (2, 'XYZ', 200) """)
  • So laden Sie Daten aus einer lokalen Datei in eine vorhandene Tabelle

    1. Lesen Sie die Daten in Spark ein.

      val data_file_location = "Path such as S3 URI to data file" val data_file = spark.read.parquet(data_file_location)
    2. Schreiben Sie die Daten in eine Iceberg-Tabelle.

      data_file.writeTo("s3tablesbucket.my_namespace.my_table").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()