

# Registro de catálogos de buckets de tabla de S3 y consulta de tablas desde Athena
<a name="gdc-register-s3-table-bucket-cat"></a>

Los buckets de tabla de S3 son un tipo de bucket de Amazon S3 diseñado específicamente para almacenar datos tabulares en tablas de Apache Iceberg. Los buckets de tablas automatizan tareas de administración de tablas, como la compactación, la administración de instantáneas y la recopilación de elementos no utilizados, para optimizar continuamente el rendimiento de las consultas y minimizar los costos. Tanto si recién comienza como si cuenta con miles de tablas en el entorno de Iceberg, los buckets de tabla simplifican el uso de los lagos de datos a cualquier escala. Para obtener más información, consulte [buckets de tabla](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html).

## Consideraciones y limitaciones
<a name="gdc-register-s3-table-consideration"></a>
+ Todas las operaciones DDL compatibles con las tablas de Iceberg son compatibles con las tablas de S3, excepto los siguientes:
  + `ALTER TABLE RENAME`, `CREATE VIEW` y `ALTER DATABASE` no son compatibles.
  + `OPTIMIZE` y `VACUUM`: puede gestionar la compactación y la gestión de instantáneas en S3. Para obtener más información, consulte [la documentación de mantenimiento de tablas de S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html).
+ No se admiten consultas DDL en tablas de S3 registradas como orígenes de datos de Athena.
+ No se admite la reutilización del resultado de la consulta.
+ En los grupos de trabajo con el cifrado SSE-KMS, CSE-KMS activado, no se pueden ejecutar operaciones de escritura como `INSERT`, `UPDATE`, `DELETE` o `MERGE` en tablas de S3.
+ En los grupos de trabajo con la opción Pagos de solicitantes de S3 (S3 Requester Pays) habilitada, no puede ejecutar operaciones DML en tablas de S3.

## Consulta de tablas de S3 desde Athena
<a name="gdc-register-s3-table-prereq-setup"></a>

**Complete estos requisitos previos antes de consultar las tablas de S3 desde Athena**

1. Cree un bucket de tabla de S3. Para obtener más información, consulte [Cómo crear un bucket de tabla](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-create.html) en la Guía del usuario de Amazon Simple Storage Service. 

1. Asegúrese de que la integración de sus cubos de mesa con AWS Glue Data Catalog sea correcta. Para conocer los permisos necesarios y los pasos de configuración, consulte [Requisitos previos para la integración de las Tablas de S3](https://docs.aws.amazon.com/glue/latest/dg/s3tables-catalog-prerequisites.html) y [Habilitar la integración de las tablas de S3 con los Catálogo de datos de Glue](https://docs.aws.amazon.com/glue/latest/dg/enable-s3-tables-catalog-integration.html) en la Guía para desarrolladores AWS Glue.

1. Para la entidad principal que utilice para ejecutar consultas con Athena, conceda permisos sobre el catálogo de tablas de S3 mediante uno de los siguientes enfoques: 

   **Opción 1: usar permisos de IAM**

   Al utilizar el control de acceso de IAM, su entidad principal necesita permisos tanto en los recursos AWS Glue Data Catalog como en los recursos de tablas de Amazon S3.

   La siguiente lista contiene todos los permisos `s3tables` necesarios para realizar cualquier operación DDL o DML compatible en sus tablas de S3 en Athena:
   + `s3tables:GetTableBucket`
   + `s3tables:GetNamespace`
   + `s3tables:GetTable`
   + `s3tables:GetTableData`
   + `s3tables:PutTableData`
   + `s3tables:ListNamespaces`
   + `s3tables:ListTables`
   + `s3tables:DeleteNamespace`
   + `s3tables:DeleteTable`
   + `s3tables:CreateNamespace`
   + `s3tables:CreateTable`
   + `s3tables:UpdateTableMetadataLocation`

   Aplique estos permisos a un grupo de tablas de S3 y a recursos de tablas de S3 específicos o utilice `*` como recurso para conceder acceso a todos los grupos de tablas y tablas de su cuenta. Estos permisos se pueden combinar con la política administrada [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html) para habilitar una funcionalidad completa.

   **Opción 2: usar los permisos de Lake Formation**

   Para habilitar el control de acceso detallado, puede conceder permisos de Lake Formation en el catálogo de la tabla de S3, ya sea a través de la consola de Lake Formation o la AWS CLI. Esto requiere registrar sus buckets de tablas de S3 como una ubicación de datos de Lake Formation. Para obtener más información sobre el proceso de migración o integración, consulte [Creación de un catálogo de tablas de Amazon S3 en la AWS Glue Data Catalog](https://docs.aws.amazon.com/lake-formation/latest/dg/create-s3-tables-catalog.html) en la Guía para desarrolladores de Lake Formation.

------
#### [ Consola de administración de AWS ]

   1. Abra la consola de AWS Lake Formation en [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) e inicie sesión como administrador del lago de datos. Para obtener más información sobre cómo crear un administrador del lago de datos, consulte [Cómo crear un administrador del lago de datos](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin).

   1. En el panel de navegación, elija **Permisos de datos** y, a continuación, seleccione **Conceder**. 

   1. En la página **Conceder permisos**, en **Entidades principales**, elija la entidad principal que desea utilizar para enviar consultas desde Athena.

   1. En **Etiquetas LF o recursos de catálogo**, elija **Recursos de catálogo de datos con nombre**.

   1. En **Catálogos**, elija un catálogo de datos de Glue que haya creado a partir de la integración del bucket de tablas. Por ejemplo, *<accoundID>*:s3tablescatalog/*amzn-s3-demo-bucket*.

   1. En **Permisos del catálogo**, elija **Super**.

   1. Elija **Conceder**.

------
#### [ AWS CLI ]

   Ejecute el siguiente comando con el rol de administrador del lago de datos de Lake Formation para conceder acceso a la entidad principal que utiliza para enviar consultas desde Athena. 

   ```
   aws lakeformation grant-permissions \
   --region <region (Example,us-east-1)> \
   --cli-input-json \
   '{
       "Principal": {
           "DataLakePrincipalIdentifier": "<user or role ARN (Example, arn:aws:iam::<Account ID>:role/ExampleRole>"
       },
       "Resource": {
           "Catalog": {
               "Id":"<Account ID>:s3tablescatalog/amzn-s3-demo-bucket"
           }
       },
       "Permissions": ["ALL"]
   }'
   ```

------

**Enviar consultas para tablas de S3**

1. Envíe una consulta `CREATE DATABASE` desde Athena con el usuario/rol concedido anteriormente. En este ejemplo, `s3tablescatalog` es el catálogo de datos de Glue principal creado a partir de la integración, y ` s3tablescatalog/amzn-s3-demo-bucket` es el catálogo de datos de Glue secundario creado para cada bucket de tabla de S3. Existen dos formas de realizar la consulta.

------
#### [ Option 1 ]

   Especifique el catálogo de datos de Glue secundario (`s3tablescatalog/amzn-s3-demo-bucket`) directamente desde la consola o la AWS CLI.

   **Uso de Consola de administración de AWS**

   1. Abra la consola de Athena en [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/).

   1. En el menú de navegación de la izquierda, en **Nombre del origen de datos**, elija **AwsDataCatalog**.

   1. Para **Catálogo**, elija **s3tablescatalog/*amzn-s3-demo-bucket***.

   1. En el editor de consultas, ingrese una consulta como `CREATE DATABASE test_namespace`.

   **Uso de AWS CLI**

   Ejecute el siguiente comando.

   ```
   aws athena start-query-execution \ 
   --query-string 'CREATE DATABASE `test_namespace`' \ 
   --query-execution-context '{"Catalog": "s3tablescatalog/amzn-s3-demo-bucket"}' \
   --work-group "primary"
   ```

------
#### [ Option 2 ]

   Cree un catálogo de datos de Athena a partir del catálogo de datos de Glue secundario en la consola de Athena y especifíquelo como catálogo en la consulta. Para obtener más información, consulte [Registro de catálogos de buckets de tabla de S3 como orígenes de datos de Athena](#gdc-register-s3-table-console-steps).

------

1. Con la base de datos que creó en el paso anterior, utilice `CREATE TABLE` para crear una tabla. En el siguiente ejemplo, se crea una tabla en la base de datos *`test_namespace`* que creó anteriormente en el catálogo `s3tablescatalog/amzn-s3-demo-bucket` de Glue.

------
#### [ Consola de administración de AWS ]

   1. En el menú de navegación de la izquierda, en **Nombre del origen de datos**, elija **AwsDataCatalog**.

   1. Para **Catálogo**, elija **s3tablescatalog/*amzn-s3-demo-bucket***.

   1. Para **Base de datos**, elija **test\$1namespace**.

   1. En el editor de consultas, ejecute la siguiente consulta.

      ```
      CREATE TABLE daily_sales (
              sale_date date,
              product_category
              string, sales_amount double)
      PARTITIONED BY (month(sale_date))
      TBLPROPERTIES ('table_type' = 'iceberg')
      ```

------
#### [ AWS CLI ]

   Ejecute el siguiente comando.

   ```
   aws athena start-query-execution \
   --query-string "CREATE TABLE daily_sales (
           sale_date date,
           product_category
           string, sales_amount double)
   PARTITIONED BY (month(sale_date))
   TBLPROPERTIES ('table_type' = 'iceberg')" \
   --query-execution-context '{"Catalog": "s3tablescatalog/amzn-s3-demo-bucket", "Database":"test_namespace"}' \
   --work-group "primary"
   ```

------

1. Inserte datos en la tabla que creó en el paso anterior.

------
#### [ Consola de administración de AWS ]

   1. En el menú de navegación de la izquierda, en **Nombre del origen de datos**, elija **AwsDataCatalog**.

   1. Para **Catálogo**, elija **s3tablescatalog/*amzn-s3-demo-bucket***.

   1. Para **Base de datos**, elija **test\$1namespace**.

   1. En el editor de consultas, ejecute la siguiente consulta.

      ```
      INSERT INTO daily_sales
      VALUES 
          (DATE '2024-01-15', 'Laptop', 900.00),
          (DATE '2024-01-15', 'Monitor', 250.00),
          (DATE '2024-01-16', 'Laptop', 1350.00),
          (DATE '2024-02-01', 'Monitor', 300.00);
      ```

------
#### [ AWS CLI ]

   Ejecute el siguiente comando.

   ```
   aws athena start-query-execution \
   --query-string "INSERT INTO \"s3tablescatalog/amzn-s3-demo-bucket\".test_namespace.daily_sales
   VALUES 
   (DATE '2024-01-15', 'Laptop', 900.00),
   (DATE '2024-01-15', 'Monitor', 250.00),
   (DATE '2024-01-16', 'Laptop', 1350.00),
   (DATE '2024-02-01', 'Monitor', 300.00)"\ 
   --work-group "primary"
   ```

------

1. Después de insertar los datos en la tabla, puede consultarlos.

------
#### [ Consola de administración de AWS ]

   1. En el menú de navegación de la izquierda, en **Nombre del origen de datos**, elija **AwsDataCatalog**.

   1. Para **Catálogo**, elija **s3tablescatalog/*amzn-s3-demo-bucket***.

   1. Para **Base de datos**, elija **test\$1namespace**.

   1. En el editor de consultas, ejecute la siguiente consulta.

      ```
      SELECT
          product_category,
          COUNT(*) AS units_sold,
          SUM(sales_amount) AS total_revenue,
          AVG(sales_amount) AS average_price
      FROM
          daily_sales
      WHERE
          sale_date BETWEEN DATE '2024-02-01' 
                       AND DATE '2024-02-29'
      GROUP BY
          product_category
      ORDER BY
          total_revenue DESC
      ```

------
#### [ AWS CLI ]

   Ejecute el siguiente comando.

   ```
   aws athena start-query-execution \
   --query-string "SELECT product_category,
       COUNT(*) AS units_sold,
       SUM(sales_amount) AS total_revenue,
       AVG(sales_amount) AS average_price
   FROM \"s3tablescatalog/amzn-s3-demo-bucket\".test_namespace.daily_sales
   WHERE sale_date BETWEEN DATE '2024-02-01' AND DATE '2024-02-29'
   GROUP BY product_category
   ORDER BY total_revenue DESC"\
   --work-group "primary"
   ```

------

## Creación de tablas de S3 en Athena
<a name="gdc-create-s3-tables-athena"></a>

Athena admite la creación de tablas en los espacios de nombres de tablas de S3 existentes o en los espacios de nombres creados en Athena con introducciones `CREATE DATABASE`. Para crear una tabla de S3 desde Athena, la sintaxis es la misma que cuando se [crea una tabla de Iceberg normal](querying-iceberg-creating-tables.md), excepto que no se especifica la `LOCATION`, como se muestra en el siguiente ejemplo.

```
CREATE TABLE
[db_name.]table_name (col_name data_type [COMMENT col_comment] [, ...] )
[PARTITIONED BY (col_name | transform, ... )]
[TBLPROPERTIES ([, property_name=property_value] )]
```

También puede crear tablas de S3 por medio de las instrucciones CREATE TABLE AS SELECT (CTAS). Para obtener más información, consulte [CTAS para tablas de S3](#ctas-s3-tables).

## Registro de catálogos de buckets de tabla de S3 como orígenes de datos de Athena
<a name="gdc-register-s3-table-console-steps"></a>

Para registrar catálogos de buckets de tabla de S3 en la consola de Athena, siga estos pasos.

1. Abra la consola de Athena en [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/).

1. En el panel de navegación, elija **Orígenes de datos y catálogos**.

1. En la página **Orígenes de datos y catálogos**, elija **Crear origen de datos**.

1. En **Elegir un origen de datos**, elija **Amazon S3: AWS Glue Data Catalog**.

1. En la sección **AWS Glue Data Catalog**, bajo **Cuenta de origen de datos**, elija **AWS Glue Data Catalog en esta cuenta**.

1. En **Crear una tabla o registrar un catálogo**, elija **Registrar un nuevo catálogo de AWS Glue**.

1. En la sección **Detalles del origen de datos**, en **Nombre del origen de datos**, ingrese el nombre que desea utilizar para especificar el origen de datos en las consultas SQL o utilice el nombre predeterminado que se genera.

1. En **Catálogo**, seleccione **Examinar** para buscar una lista de catálogos de AWS Glue en la misma cuenta. Si no ve ningún catálogo existente, cree uno en la [consola de AWS Glue](https://console.aws.amazon.com/glue/). 

1. En el cuadro de diálogo **Examinar catálogos de AWS Glue**, seleccione el catálogo que desea utilizar y, a continuación, elija **Seleccionar**.

1. (Opcional) En **Etiquetas**, ingrese cualquier par de clave/valor que desee asociar al origen de datos.

1. Elija **Siguiente**.

1. En la página **Revisar y crear**, compruebe que la información introducida es correcta y, a continuación, seleccione **Crear origen de datos**.

## CTAS para tablas de S3
<a name="ctas-s3-tables"></a>

Amazon Athena ahora admite operaciones CREATE TABLE AS SELECT (CTAS) para tablas de S3. Esta característica permite crear nuevas tablas de S3 en función de los resultados de una consulta SELECT. 

Al crear una consulta CTAS para una tabla de S3, existen algunas diferencias importantes en comparación con las tablas estándar de Athena:
+ Debe omitir la propiedad de ubicación porque las tablas de S3 administran automáticamente sus propias ubicaciones de almacenamiento.
+ La propiedad `table_type` se establece de forma predeterminada en `ICEBERG`, por lo que no es necesario especificarla explícitamente en la consulta.
+ Si no se especifica un formato, el sistema utiliza automáticamente `PARQUET` como formato predeterminado para los datos.
+ Todas las demás propiedades siguen la misma sintaxis que las tablas de Iceberg normales.

Antes de crear tablas de S3 por medio de CTAS, asegúrese de contar con los permisos necesarios configurados en IAM o AWS Lake Formation. Específicamente, necesita permisos para crear tablas en el catálogo de las tablas de S3. Sin estos permisos, se producirá un error en las operaciones CTAS.

**nota**  
Si se produce un error en la consulta CTAS, es posible que tenga que eliminar la tabla por medio de la [API de las tablas de S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-delete.html) antes de intentar volver a ejecutar la consulta. No puede usar las instrucciones `DROP TABLE` de Athena para eliminar la tabla que fue creada parcialmente por la consulta. 

**Ejemplo**

```
CREATE TABLE "s3tablescatalog/amzn-s3-demo-bucket"."namespace"."s3-table-name"
WITH (
    format = 'PARQUET'
)
AS SELECT *
FROM source_table;
```