

# Registrar catálogos de buckets de tabela do S3 e consultar tabelas no Athena
<a name="gdc-register-s3-table-bucket-cat"></a>

Os buckets de tabela do Amazon S3 são um tipo de bucket no Amazon S3 criado especificamente para armazenar dados tabulares nas tabelas do Apache Iceberg. Os buckets de tabela automatizam as tarefas de gerenciamento de tabelas, como compactação, gerenciamento de snapshots e coleta de resíduos, para otimizar continuamente o desempenho das consultas e minimizar os custos. Se você está apenas começando ou tem milhares de tabelas em seu ambiente do Iceberg, os buckets de tabela simplificam os data lakes em qualquer escala. Para obter mais informações, consulte [Buckets de tabela](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html).

## Considerações e limitações
<a name="gdc-register-s3-table-consideration"></a>
+ Todas as operações de DDL aceitas em tabelas do Iceberg são compatíveis com tabelas do S3, com as seguintes exceções:
  + Não há suporte a `ALTER TABLE RENAME`, `CREATE VIEW` e `ALTER DATABASE`.
  + `OPTIMIZE` e `VACUUM`: é possível gerenciar a compactação e o gerenciamento de snapshots no S3. Para obter mais informações, consulte a [documentação de manutenção de tabelas do S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html).
+ Não há suporte a consultas de DDL em tabelas do S3 registradas como fontes de dados do Athena.
+ Não há suporte à reutilização de resultados de consultas.
+ Em grupos de trabalho com criptografia SSE-KMS, CSE-KMS ativada, não é possível executar operações de gravação como `INSERT`, `UPDATE`, `DELETE` ou `MERGE` em tabelas do S3.
+ Em grupos de trabalho com a opção S3 Requester Pays ativada, não é possível executar operações de DML em tabelas do S3.

## Consultar tabelas do S3 via Athena
<a name="gdc-register-s3-table-prereq-setup"></a>

**Conclua estas etapas obrigatórias antes de consultar tabelas do S3 no Athena**

1. Crie um bucket de tabela do S3. Para obter mais informações, consulte [Creating a table bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-create.html) no Guia do usuário do Amazon Simple Storage Service. 

1. Certifique-se de que a integração de seus buckets com o AWS Glue Data Catalog seja bem-sucedida. Para obter as permissões necessárias e as etapas de configuração, consulte [Prerequisites for S3 Tables integration](https://docs.aws.amazon.com/glue/latest/dg/s3tables-catalog-prerequisites.html) (Pré-requisitos para a integração do Tabelas do S3) e [Enabling S3 Tables integration with Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/enable-s3-tables-catalog-integration.html) (Como habilitar a integração do Tabelas do S3 com o Glue Data Catalog) no Guia do desenvolvedor do AWS Glue.

1. Para a entidade principal que você usa para executar consultas com o Athena, conceda permissões no catálogo do Tabelas do S3 usando uma das seguintes abordagens: 

   **Opção 1: usar permissões do IAM**

   Ao usar o controle de acesso do IAM, sua entidade principal precisa de permissões tanto nos recursos AWS Glue Data Catalog quanto nos recursos do Tabelas do Amazon S3.

   A lista a seguir contém todas as permissões `s3tables` necessárias para realizar qualquer operação DDL ou DML compatível com suas Tabelas do S3 no 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 essas permissões a recursos específicos do bucket do Tabelas do S3 e do recursos do Tabelas do S3 ou use `*` como recurso para conceder acesso a todos os buckets e tabelas da sua conta. Essas permissões podem ser combinadas com a política gerenciada [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 permitir a funcionalidade completa.

   **Opção 2: usar as permissões do Lake Formation**

   Alternativamente, para habilitar o controle de acesso granular, você pode conceder permissões ao Lake Formation no catálogo do Tabelas do S3, seja por meio do console do Lake Formation ou AWS CLI. Isso requer o registro dos seus buckets da tabela do S3 como um local de dados do Lake Formation. Para obter mais informações, consulte [Criar um catálogo do Tabelas do Amazon S3 no AWS Glue Data Catalog](https://docs.aws.amazon.com/lake-formation/latest/dg/create-s3-tables-catalog.html) no Guia do Desenvolvedor do Lake Formation.

------
#### [ Console de gerenciamento da AWS ]

   1. Abra o console do AWS Lake Formation em [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) e acesse como administrador do data lake. Para obter mais informações sobre como criar um administrador de data lake, consulte [Create a data lake administrator](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin).

   1. No painel de navegação, escolha **Permissões de dados** e **Conceder**. 

   1. Na página **Conceder Permissões**, em **Entidades principais**, escolha a entidade principal que deseja usar para enviar uma consulta do Athena.

   1. Em **Tags do LF ou recursos de catálogo**, escolha **Recursos do catálogo de dados nomeados**.

   1. Em **Catálogos**, escolha um catálogo de dados do Glue que você criou com base na integração do seu bucket de tabela. Por exemplo, *<accoundID>*:s3tablescatalog/*amzn-s3-demo-bucket*.

   1. Em **Permissões de catálogo**, escolha **Super**.

   1. Selecione **Conceder**.

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

   Execute o comando a seguir com o perfil de administrador do data lake do Lake Formation para conceder acesso à entidade principal que você usa para enviar consultas do 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 tabelas do S3**

1. Envie uma consulta `CREATE DATABASE` do Athena com o usuário/perfil concedido acima. Neste exemplo, `s3tablescatalog` é o Catálogo de Dados do Glue principal criado com base na integração e ` s3tablescatalog/amzn-s3-demo-bucket` o Catálogo de Dados do Glue secundário criado para cada bucket de tabela do S3. Há duas maneiras de fazer a consulta.

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

   Especifique o Catálogo de Dados do Glue secundário (`s3tablescatalog/amzn-s3-demo-bucket`) diretamente do console ou AWS CLI.

   **Usar o Console de gerenciamento da AWS**

   1. Abra o console do Athena em [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/).

   1. No painel de navegação à esquerda, em **Nome da fonte de dados**, escolha **AwsDataCatalog**.

   1. Em **Catálogo**, escolha **s3tablescatalog/*amzn-s3-demo-bucket***.

   1. No editor de consultas, insira uma consulta, como `CREATE DATABASE test_namespace`.

   **Usar o AWS CLI**

   Execute o comando a seguir.

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

   Crie o catálogo de dados do Athena com base no Catálogo de Dados do Glue secundário no console do Athena e especifique-o como um catálogo na consulta. Para obter mais informações, consulte [Registrar catálogos de buckets de tabelas do S3 como fontes de dados do Athena](#gdc-register-s3-table-console-steps).

------

1. Com o banco de dados que você criou na etapa anterior, use `CREATE TABLE` para criar uma tabela. O exemplo a seguir cria uma tabela no banco de dados *`test_namespace`* que você criou anteriormente no catálogo `s3tablescatalog/amzn-s3-demo-bucket` do Glue.

------
#### [ Console de gerenciamento da AWS ]

   1. No painel de navegação à esquerda, em **Nome da fonte de dados**, escolha **AwsDataCatalog**.

   1. Em **Catálogo**, escolha **s3tablescatalog/*amzn-s3-demo-bucket***.

   1. Em **Banco de dados**, escolha **test\$1namespace**.

   1. No editor de consultas, execute a consulta a seguir.

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

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

   Execute o comando a seguir.

   ```
   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. Insira dados na tabela que você criou na etapa anterior.

------
#### [ Console de gerenciamento da AWS ]

   1. No painel de navegação à esquerda, em **Nome da fonte de dados**, escolha **AwsDataCatalog**.

   1. Em **Catálogo**, escolha **s3tablescatalog/*amzn-s3-demo-bucket***.

   1. Em **Banco de dados**, escolha **test\$1namespace**.

   1. No editor de consultas, execute a consulta a seguir.

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

   Execute o comando a seguir.

   ```
   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. Após inserir os dados na tabela, você poderá consultá-los.

------
#### [ Console de gerenciamento da AWS ]

   1. No painel de navegação à esquerda, em **Nome da fonte de dados**, escolha **AwsDataCatalog**.

   1. Em **Catálogo**, escolha **s3tablescatalog/*amzn-s3-demo-bucket***.

   1. Em **Banco de dados**, escolha **test\$1namespace**.

   1. No editor de consultas, execute a consulta a seguir.

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

   Execute o comando a seguir.

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

------

## Criar tabelas do S3 no Athena
<a name="gdc-create-s3-tables-athena"></a>

O Athena oferece suporte à criação de tabelas em namespaces de tabela do S3 existentes ou namespaces criados no Athena com instruções `CREATE DATABASE`. Para criar uma tabela do S3 via Athena, a sintaxe é a mesma de quando você [cria uma tabela do Iceberg](querying-iceberg-creating-tables.md), exceto que você não especifica o `LOCATION`, conforme mostrado no exemplo a seguir.

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

Você também pode criar tabelas do S3 usando instruções CREATE TABLE AS SELECT (CTAS). Para obter mais informações, consulte [CTAS para tabelas do S3](#ctas-s3-tables).

## Registrar catálogos de buckets de tabelas do S3 como fontes de dados do Athena
<a name="gdc-register-s3-table-console-steps"></a>

Para registrar catálogos de buckets de tabelas do S3 com o console do Athena, execute as etapas a seguir.

1. Abra o console do Athena em [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/).

1. No painel de navegação, escolha **Fontes de dados e catálogos**.

1. Na página **Fontes de dados e catálogos**, escolha **Criar fonte de dados**.

1. Em **Escolher uma fonte de dados**, escolha **Amazon S3 - AWS Glue Data Catalog**.

1. Na seção **AWS Glue Data Catalog**, em **Conta da fonte de dados**, escolha **AWS Glue Data Catalog nesta conta**.

1. Em **Criar uma tabela ou registrar um catálogo**, escolha **Registrar um novo catálogo do AWS Glue**.

1. Na seção **Detalhes da fonte de dados**, em **Nome da fonte de dados**, insira o nome que deseja usar para especificar a fonte de dados em suas consultas SQL ou use o nome padrão gerado.

1. Em **Catálogo**, escolha **Procurar** para pesquisar uma lista de catálogos do AWS Glue na mesma conta. Se você não encontrar nenhum catálogo existente, crie um no [console do AWS Glue](https://console.aws.amazon.com/glue/). 

1. Na caixa de diálogo **Procurar catálogos do AWS Glue**, selecione o catálogo que deseja usar e selecione **Escolher**.

1. (Opcional) Em **Tags**, adicione pares de chave/valor que queira associar à fonte de dados.

1. Escolha **Próximo**.

1. Na página **Revisar e criar**, verifique se as informações inseridas estão corretas e selecione **Criar fonte de dados**.

## CTAS para tabelas do S3
<a name="ctas-s3-tables"></a>

O Amazon Athena agora é compatível com operações CREATE TABLE AS SELECT (CTAS) para tabelas do S3. Esse atributo permite criar novas tabelas do S3 com base nos resultados de uma consulta SELECT. 

Ao criar uma consulta CTAS para uma tabela do S3, há algumas diferenças importantes em relação às tabelas padrão do Athena:
+ Você deve omitir a propriedade de localização porque as tabelas do S3 gerenciam automaticamente seus próprios locais de armazenamento.
+ A propriedade `table_type` assume o padrão `ICEBERG`, portanto, você não precisa especificá-la explicitamente na consulta.
+ Se você não especificar um formato, o sistema usará automaticamente `PARQUET` como formato padrão para os dados.
+ Todas as outras propriedades seguem a mesma sintaxe das tabelas normais do Iceberg.

Antes de criar o Tabelas do S3 usando CTAS, verifique se você tem as permissões necessárias configuradas no IAM ou no AWS Lake Formation. Especificamente, você precisa de permissões para criar tabelas no catálogo de tabelas do S3. Sem essas permissões, suas operações CTAS não terão sucesso.

**nota**  
Se a consulta CTAS não tiver sucesso, poderá ser necessário excluir a tabela usando a [API de tabelas do S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-delete.html) antes de tentar executar a consulta novamente. Não é possível usar as instruções `DROP TABLE` do Athena para remover a tabela que foi parcialmente criada pela consulta. 

**Exemplo**

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