Acceso a tablas de Amazon S3 con el catálogo de Tablas de Amazon S3 para Apache Iceberg - Amazon Simple Storage Service

Acceso a tablas de Amazon S3 con el catálogo de Tablas de Amazon S3 para Apache Iceberg

Puede acceder a las tablas de S3 desde motores de consulta de código abierto como Apache Spark utilizando el catálogo de clientes de Tablas de Amazon S3 para Apache Iceberg. El catálogo de Tablas de Amazon S3 para Apache Iceberg es una biblioteca de código abierto alojada por AWS Labs. Funciona mediante la traducción de las operaciones de Apache Iceberg en los motores de consulta (como el descubrimiento de tablas, las actualizaciones de metadatos y la adición o eliminación de tablas) en operaciones de la API de tablas de S3.

El catálogo de Tablas de Amazon S3 para Apache Iceberg se distribuye como un archivo Maven JAR llamado s3-tables-catalog-for-iceberg.jar. Puede crear el archivo JAR del catálogo de clientes desde el repositorio de AWS Labs GitHub, o bien descargarlo directamente desde Maven. Al conectarse a las tablas, el catálogo de clientes JAR se utiliza como dependencia al inicializar una sesión de Spark para Apache Iceberg.

Uso del catálogo de Tablas de Amazon S3 para Apache Iceberg con Apache Spark

Puede usar el catálogo de Tablas de Amazon S3 para Apache Iceberg como catálogo de clientes para conectarse a tablas desde aplicaciones de código abierto al inicializar una sesión de Spark. En la configuración de la sesión, especifique las dependencias de Iceberg y Amazon S3, y cree un catálogo personalizado que utilice su bucket de tablas como almacén de metadatos.

Requisitos previos
Para inicializar una sesión de Spark usando el catálogo de Tablas de Amazon S3 para Apache Iceberg
  • Inicialice una sesión de Spark con el siguiente comando. Para utilizar el comando, reemplace el número de versión del catálogo de Tablas de Amazon S3 para Apache Iceberg por la última versión del repositorio de AWS Labs GitHub y el ARN del bucket de tablas por el ARN de su propio bucket de tablas.

    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

Consulta de tablas de S3 con Spark SQL

Con Spark, puede ejecutar operaciones DQL, DML y DDL en tablas de S3. Al consultar tablas, se utiliza el nombre de tabla completamente calificado (incluido el nombre del catálogo de sesión) siguiendo este patrón:

CatalogName.NamespaceName.TableName

En las siguientes consultas de ejemplo se muestran algunas formas de interactuar con tablas de S3. Para utilizar estas consultas de ejemplo en el motor de consultas, reemplace los valores de marcador de posición de entrada de usuario por los suyos propios.

Consulta de tablas con Spark
  • Creación de un espacio de nombres de

    spark.sql(" CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.my_namespace")
  • Creación de una tabla

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

    spark.sql(" SELECT * FROM s3tablesbucket.my_namespace.`my_table` ").show()
  • Inserción de datos en una tabla

    spark.sql( """ INSERT INTO s3tablesbucket.my_namespace.my_table VALUES (1, 'ABC', 100), (2, 'XYZ', 200) """)
  • Carga de un archivo de datos existente en una tabla

    1. Lea los datos en Spark.

      val data_file_location = "Path such as S3 URI to data file" val data_file = spark.read.parquet(data_file_location)
    2. Escriba los datos en una tabla de Iceberg.

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