

# Acceso a tablas de Amazon S3 con el catálogo de Tablas de Amazon S3 para Apache Iceberg
<a name="s3-tables-client-catalog"></a>

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](https://github.com/awslabs/s3-tables-catalog), o bien descargarlo directamente desde [Maven](https://mvnrepository.com/artifact/software.amazon.s3tables/s3-tables-catalog-for-iceberg). 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
<a name="s3-tables-integrating-open-source-spark"></a>

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****
+ Una identidad de IAM con acceso al bucket de tablas y a las acciones de tablas de S3. Para obtener más información, consulte [Administración de acceso para Tablas de S3](s3-tables-setting-up.md).

**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](https://github.com/awslabs/s3-tables-catalog) 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
<a name="query-with-spark"></a>

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)
     ```

  1. Escriba los datos en una tabla de Iceberg.

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