

# Consultar tabelas do Linux Foundation Delta Lake
<a name="delta-lake-tables"></a>

O Linux Foundation [Delta Lake](https://delta.io/) é um formato de tabela para análise de big data. É possível usar o Amazon Athena para ler tabelas Delta Lake armazenadas no Amazon S3 de forma direta, sem a necessidade de gerar arquivos de manifesto ou executar a instrução `MSCK REPAIR`.

O formato Delta Lake armazena os valores mínimo e máximo de cada arquivo de dados por coluna. A implementação do Athena usa essas informações para habilitar o salto de arquivos em predicados com a finalidade de eliminar arquivos indesejados da consideração.

## Considerações e limitações
<a name="delta-lake-tables-considerations-and-limitations"></a>

O suporte para o Delta Lake no Athena tem as limitações e considerações a seguir:
+ **Somente tabelas com catálogo do AWS Glue**: o suporte nativo do Delta Lake é compatível somente por meio de tabelas registradas no AWS Glue. Se você tiver uma tabela Delta Lake registrada em outro metastore, ainda poderá mantê-la e tratá-la como metastore principal. Como os metadados do Delta Lake são armazenados no sistema de arquivos (por exemplo, no Amazon S3) e não no metastore, o Athena requer somente a propriedade “location” no AWS Glue para ler as tabelas Delta Lake.
+ **Somente versão 3 do mecanismo**: as consultas do Delta Lake tem suporte somente na versão 3 do mecanismo do Athena. Você deve garantir que o grupo de trabalho criado esteja configurado para usar a versão 3 do mecanismo do Athena.
+ **Nenhum suporte para passagem de tempo**: não há suporte para consultas que usam as funcionalidades de passagem de tempo do Delta Lake.
+ **Somente leitura**: não há suporte para gravar instruções DML, como `UPDATE`, `INSERT` ou `DELETE`.
+ **Compatibilidade com o Lake Formation**: a integração com o Lake Formation está disponível para tabelas do Delta Lake com seu esquema sincronizado com o AWS Glue. Para obter mais informações, consulte [Usar o AWS Lake Formation com o Amazon Athena](https://docs.aws.amazon.com/lake-formation/latest/dg/athena-lf.html) e [Configurar permissões para uma tabela do Delta Lake](https://docs.aws.amazon.com/lake-formation/latest/dg/set-up-delta-table.html) no *Guia de desenvolvedor do AWS Lake Formation*.
+ **Suporte DDL limitado**: as instruções DDL a seguir são compatíveis: `CREATE EXTERNAL TABLE`, `SHOW COLUMNS`, `SHOW TBLPROPERTIES`, `SHOW PARTITIONS`, `SHOW CREATE TABLE` e `DESCRIBE`. Para obter informações sobre como usar a instrução `CREATE EXTERNAL TABLE`, consulte a seção [Introdução às tabelas do Delta Lake](delta-lake-tables-getting-started.md).
+ **Não é possível ignorar os objetos do Amazon Glacier**: se os objetos na tabela do Linux Foundation Delta Lake estiverem em uma classe de armazenamento do Amazon Glacier, definir a propriedade da tabela `read_restored_glacier_objects` como `false` não surtirá efeito.

  Por exemplo, suponhamos que você emita o seguinte comando:

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  Para tabelas do Iceberg e do Delta Lake, o comando gera o erro Chave de propriedade da tabela não compatível: read\$1restored\$1glacier\$1objects. Para as tabelas do Hudi, o comando `ALTER TABLE` não gera erro, mas mesmo assim os objetos do Amazon Glacier não são ignorados. A execução de consultas `SELECT` após o comando `ALTER TABLE` continua a retornar todos os objetos.
+ **Tabelas criptografadas**: o Athena não é compatível com a leitura nativa de tabelas do Delta Lake criptografadas pelo CSE-KMS. Isso inclui as instruções SELECT e as instruções DDL.

### Versionamento do Delta Lake e do Athena
<a name="delta-lake-tables-versioning"></a>

O Athena não usa o [versionamento](https://docs.delta.io/latest/releases.html) listado na documentação do Delta Lake. Para determinar se as tabelas do Delta Lake são compatíveis com o Athena, considere estas duas características:
+ **Versão do leitor**: cada tabela do Delta Lake tem uma versão de leitor. Atualmente, a versão é um número de 1 a 3. Consultas que incluírem uma tabela com uma versão de leitor não compatível com o Athena apresentarão falhas.
+ **Características da tabela**: cada tabela do Delta Lake também pode declarar um conjunto de atributos de leitor/gravador. Como o Athena é compatível com o Delta Lake apenas para leitura, a compatibilidade do atributo de gravação de tabelas não se aplica. Porém, consultas em tabelas com atributos de leitura de tabela não compatíveis apresentarão falhas.

A tabela a seguir mostra as versões e os atributos do leitor de tabela do Delta Lake que são compatíveis com o Athena.


****  

| Tipo da consulta | Versões de leitor compatíveis | Atributos de leitor compatíveis | 
| --- | --- | --- | 
| DQL (instruções SELECT) | <= 3 | [Mapeamento de colunas](https://docs.delta.io/latest/delta-column-mapping.html), [timestampNtz](https://github.com/delta-io/delta/blob/master/PROTOCOL.md#timestamp-without-timezone-timestampntz), [vetores de exclusão](https://docs.delta.io/latest/delta-deletion-vectors.html) | 
| DDL | <= 1 | Não aplicável. Os atributos de leitor só podem ser declarados em tabelas com um leitor versão 2 ou superior. | 
+ Para obter uma lista dos recursos de tabela do Delta Lake, consulte [Valid feature names in table features](https://github.com/delta-io/delta/blob/master/PROTOCOL.md#valid-feature-names-in-table-features) no GitHub.com
+ Para ver uma lista dos atributos do Delta Lake por versão de protocolo, consulte [Features by protocol version](https://docs.delta.io/latest/versioning.html#features-by-protocol-version) no GitHub.com.

Para criar uma tabela do Delta Lake no Athena com uma versão de leitor acima de 1, consulte [Sincronizar metadados do Delta Lake](delta-lake-tables-syncing-metadata.md).

**Topics**
+ [Considerações e limitações](#delta-lake-tables-considerations-and-limitations)
+ [Tipos de dados de colunas com suporte](delta-lake-tables-supported-data-types-columns.md)
+ [Introdução às tabelas do Delta Lake](delta-lake-tables-getting-started.md)
+ [Consultar tabelas do Delta Lake com SQL](delta-lake-tables-querying.md)
+ [Sincronizar metadados do Delta Lake](delta-lake-tables-syncing-metadata.md)
+ [Recursos adicionais](delta-lake-tables-additional-resources.md)

# Tipos de dados de colunas com suporte
<a name="delta-lake-tables-supported-data-types-columns"></a>

Esta seção descreve os tipos de dados com suporte para colunas sem partições e com partições. 

## Tipos de dados compatíveis para colunas sem partições
<a name="delta-lake-tables-supported-data-types-non-partition-columns"></a>

Para colunas sem partições, há suporte para todos os tipos de dados compatíveis com o Athena, exceto `CHAR`. Não há suporte para `CHAR` no próprio protocolo do Delta Lake). Os tipos de dados compatíveis incluem:

```
boolean
tinyint
smallint
integer
bigint
double
float
decimal
varchar
string
binary
date
timestamp
array
map
struct
```

## Tipos de dados compatíveis para colunas com partições
<a name="delta-lake-tables-supported-data-types-partition-columns"></a>

Para colunas com partições, o Athena é compatível com tabelas com os tipos de dados a seguir:

```
boolean
integer
smallint
tinyint
bigint
decimal
float
double
date
timestamp
varchar
```

Para obter mais informações sobre os tipos de dados no Athena, consulte [Tipos de dados no Amazon Athena](data-types.md).

# Introdução às tabelas do Delta Lake
<a name="delta-lake-tables-getting-started"></a>

Para ser consultável, a tabela Delta Lake deve existir no AWS Glue. Se a tabela estiver no Amazon S3, mas não estiver no AWS Glue, execute uma instrução `CREATE EXTERNAL TABLE` usando a sintaxe a seguir. Se a tabela já existe no AWS Glue (por exemplo, porque você está usando o Apache Spark ou outro mecanismo com o AWS Glue), você pode ignorar esta etapa. Observe a omissão das definições das colunas, da biblioteca SerDe e de outras propriedades da tabela. Ao contrário das tabelas Hive tradicionais, os metadados da tabela Delta Lake são inferidos do log de transações do Delta Lake e sincronizados diretamente com o AWS Glue.

```
CREATE EXTERNAL TABLE
  [db_name.]table_name
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ('table_type' = 'DELTA')
```

**nota**  
Essa instrução não é compatível com buckets do S3 que têm pagamentos por solicitante habilitados. Se você quiser criar uma tabela do Delta Lake em um bucket do S3 com pagamentos por solicitante habilitados, siga as orientações e a instrução DDL em [Sincronizar metadados do Delta Lake](delta-lake-tables-syncing-metadata.md).
Para tabelas Delta Lake, as instruções `CREATE TABLE` que incluem mais do que as propriedades `LOCATION` e `table_type` não são permitidas.

# Consultar tabelas do Delta Lake com SQL
<a name="delta-lake-tables-querying"></a>

Para consultar uma tabela Delta Lake, use a sintaxe SQL padrão `SELECT`:

```
[ WITH with_query [, ...] ]SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
```

Para obter mais informações sobre a sintaxe `SELECT`, consulte [SELECT](select.md) na documentação do Athena.

O formato Delta Lake armazena os valores mínimo e máximo de cada arquivo de dados por coluna. O Athena usa essas informações para habilitar o salto de arquivo em predicados com a finalidade de eliminar arquivos desnecessários da consideração.

# Sincronizar metadados do Delta Lake
<a name="delta-lake-tables-syncing-metadata"></a>

O Athena sincroniza os metadados da tabela, incluindo o esquema, as colunas com partições e as propriedades da tabela, para o AWS Glue se você usar o Athena para criar a tabela Delta Lake. Com o passar do tempo, esses metadados podem perder a sincronização com os metadados da tabela subjacente no log de transações. Para manter a tabela atualizada, escolha uma das seguintes opções:
+ Use o crawler do AWS Glue para tabelas Delta Lake. Para obter mais informações, consulte [Introducing native Delta Lake table support with AWS Glue crawlers](https://aws.amazon.com/blogs/big-data/introducing-native-delta-lake-table-support-with-aws-glue-crawlers/) no *Blog do AWS Big Data* e [Programar um crawler do AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/schedule-crawler.html) no Guia do desenvolvedor do AWS Glue.
+ Solte e recrie a tabela no Athena.
+ Use o SDK, a CLI ou o console do AWS Glue para atualizar manualmente o esquema no AWS Glue.

Observe que os recursos a seguir exigem que seu esquema do AWS Glue sempre tenha o mesmo esquema do log de transações:
+ Lake Formation
+ Visualizações
+ Filtros de linha e coluna

Se o seu fluxo de trabalho não exigir nenhuma dessas funcionalidades e você preferir não manter essa compatibilidade, pode usar o DDL `CREATE TABLE` no Athena e depois adicionar o caminho do Amazon S3 como um parâmetro SerDe no AWS Glue.

## Criar uma tabela do Delta Lake usando os consoles do Athena e do AWS Glue
<a name="delta-lake-tables-syncing-metadata-console"></a>

Você pode usar o procedimento a seguir para criar uma tabela do Delta Lake com os consoles do Athena e do AWS Glue.

**Para criar uma tabela Delta Lake usando o Athena e consoles do AWS Glue**

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

1. No editor de consultas do Athena, use o seguinte DDL para criar sua tabela Delta Lake. Observe que, ao usar esse método, o valor de `TBLPROPERTIES` deve ser `'spark.sql.sources.provider' = 'delta'`, e não`'table_type' = 'delta'`.

   Observe que esse mesmo esquema (com uma única coluna chamada `col` de tipo `array<string>`) é inserido quando você usa o Apache Spark (Athena para Apache Spark) ou a maioria dos outros mecanismos para criar sua tabela.

   ```
   CREATE EXTERNAL TABLE
      [db_name.]table_name(col array<string>)
      LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
      TBLPROPERTIES ('spark.sql.sources.provider' = 'delta')
   ```

1. Abra o console do AWS Glue em [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/).

1. No painel de navegação, escolha **Catálogo de dados**, **Tabelas**.

1. Na lista de tabelas, escolha o link da sua tabela.

1. Na página da tabela, escolha **Ações**, **Editar tabela**.

1. Na seção **Parâmetros do Serde**, adicione a chave **path** com o valor **s3://amzn-s3-demo-bucket/*your-folder*/**.

1. Escolha **Salvar**.

## Criar uma tabela do Delta Lake usando a AWS CLI
<a name="delta-lake-tables-syncing-metadata-cli"></a>

Para criar uma tabela do Delta Lake usando a AWS CLI, insira um comando como o que se segue.

```
aws glue create-table --database-name dbname \
    --table-input '{"Name" : "tablename", "StorageDescriptor":{
            "Columns" : [
                {
                    "Name": "col",
                    "Type": "array<string>"
                }
            ],
            "Location" : "s3://amzn-s3-demo-bucket/<prefix>/",
            "SerdeInfo" : {
                "Parameters" : {
                    "serialization.format" : "1",
                    "path" : "s3://amzn-s3-demo-bucket/<prefix>/"
                }
            }
        },
        "PartitionKeys": [],
        "TableType": "EXTERNAL_TABLE",
        "Parameters": {
            "EXTERNAL": "TRUE",
            "spark.sql.sources.provider": "delta"
        }
    }'
```

# Recursos adicionais
<a name="delta-lake-tables-additional-resources"></a>

Para uma discussão sobre o uso de tabelas do Delta Lake com AWS Glue e fazendo consultas com o Athena, consulte [Gerencie as operações de dados do UPSERT usando o Delta Lake de código aberto e AWS Glue](https://aws.amazon.com/blogs/big-data/handle-upsert-data-operations-using-open-source-delta-lake-and-aws-glue/) no *Blog de Big Data da AWS*.