Accès direct aux tables Amazon S3 via le catalogue d’Amazon S3 Tables pour Apache Iceberg - Amazon Simple Storage Service

Accès direct aux tables Amazon S3 via le catalogue d’Amazon S3 Tables pour Apache Iceberg

Vous pouvez accéder aux tables S3 à partir de moteurs de requête open source comme Apache Spark en utilisant le catalogue d’Amazon S3 Tables pour le catalogue client Apache Iceberg. Le catalogue d’Amazon S3 Tables pour Apache Iceberg est une bibliothèque open source hébergée par AWS Labs. Elle fonctionne en traduisant les opérations Apache Iceberg de vos moteurs de requête (telles que la découverte de tables, les mises à jour des métadonnées et l’ajout ou la suppression de tables) en opérations de l’API S3 Tables.

Le catalogue d’Amazon S3 Tables pour Apache Iceberg est distribué sous la forme d’un Maven JAR appelé s3-tables-catalog-for-iceberg.jar. Vous pouvez créer le catalogue client JAR à partir du référentiel AWS Labs GitHub ou le télécharger directement depuis Maven. Lorsque vous vous connectez à des tables, le catalogue client JAR est utilisé comme dépendance lorsque vous initialisez une session Spark pour Apache Iceberg.

Utilisation du catalogue d’Amazon S3 Tables pour Apache Iceberg avec Apache Spark

Vous pouvez utiliser le catalogue d’Amazon S3 Tables pour le catalogue client Apache Iceberg afin de vous connecter aux tables à partir d’applications open source lorsque vous initialisez une session Spark. Dans la configuration de votre session, vous spécifiez Iceberg et les dépendances Amazon S3 et vous créez un catalogue personnalisé qui utilise votre compartiment de table comme entrepôt de métadonnées.

Prérequis
Pour initialiser une session Spark à l’aide du catalogue d’Amazon S3 Tables pour Apache Iceberg
  • Initialisez Spark à l’aide de la commande suivante. Pour utiliser la commande, remplacez le catalogue d’Amazon S3 Tables pour Apache Iceberg numéro de version par la dernière version à partir du référentiel AWS Labs GitHub, et l’ARN du compartiment de table par votre propre ARN de compartiment de table.

    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

Interrogation des tables S3 avec Spark SQL

Spark vous permet d’exécuter des opérations DQL, DML et DDL sur les tables S3. Lorsque vous interrogez des tables, vous utilisez le nom complet de la table, y compris le nom du catalogue de sessions, selon le modèle suivant :

CatalogName.NamespaceName.TableName

Les exemples de requêtes suivants montrent plusieurs manières d’interagir avec les tables S3. Pour utiliser ces exemples de requêtes dans votre moteur de requête, remplacez les espaces réservés à la saisie utilisateur par vos propres valeurs.

Pour interroger les tables avec Spark
  • Création d’un espace de noms

    spark.sql(" CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.my_namespace")
  • Création d’une table

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

    spark.sql(" SELECT * FROM s3tablesbucket.my_namespace.`my_table` ").show()
  • Insertion de données dans une table

    spark.sql( """ INSERT INTO s3tablesbucket.my_namespace.my_table VALUES (1, 'ABC', 100), (2, 'XYZ', 200) """)
  • Chargement d’un fichier de données existant dans une table

    1. Lisez les données dans Spark.

      val data_file_location = "Path such as S3 URI to data file" val data_file = spark.read.parquet(data_file_location)
    2. Écrivez les données dans une table Iceberg.

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