

# Particionar dados
<a name="partitions"></a>

Ao particionar os dados, você pode restringir a quantidade que cada consulta verifica, o que melhora a performance e reduz o custo. Você pode dividir seus dados em partições usando qualquer chave. Uma prática comum é particionar os dados com base no tempo, normalmente acarretando um esquema de particionamento em vários níveis. Por exemplo, um cliente que tenha dados vindos a cada hora pode optar por particionar por ano, mês, data e hora. Outro cliente, que tem dados oriundos de muitas origens diferentes, mas carregados apenas uma vez por dia, poderia particionar por um identificador de origem dos dados e data.

O Athena pode usar partições no estilo do Apache Hive, cujos caminhos de dados contêm pares de valor-chave conectados por sinais de igual (por exemplo, `country=us/...` ou `year=2021/month=01/day=26/...`). Assim, os caminhos incluem os nomes das chaves de partição e os valores que cada caminho representa. Para carregar novas partições Hive em uma tabela particionada, você pode usar o [MSCK REPAIR TABLE](msck-repair-table.md), que funciona apenas com partições no estilo Hive.

O Athena também pode usar esquemas de particionamento em estilo não Hive. Por exemplo, os logs do CloudTrail e os fluxos de entrega do Firehose usam componentes de caminho separados para componentes de data, como `data/2021/01/26/us/6fc7845e.json`. Para essas partições que não seguem o estilo do Hive, use [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) para adicionar as partições manualmente.

## Considerações e limitações
<a name="partitions-considerations-limitations"></a>

Ao usar o particionamento, lembre-se dos seguintes pontos:
+ Se você consultar uma tabela particionada e especificar a partição na cláusula `WHERE`, o Athena verificará somente os dados dessa partição.
+ Se você executar consultas em buckets do Amazon S3 com um grande número de objetos, e os dados não estiverem particionados, essas consultas poderão afetar os limites de taxa de solicitações `GET` no Amazon S3 e gerar exceções no Amazon S3. Para evitar erros, particione seus dados. Considere também ajustar suas taxas de solicitações do Amazon S3. Para obter mais informações, consulte [Padrões de design de melhores práticas: otimizar a performance do Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/request-rate-perf-considerations.html).
+ Os locais das partições que serão usados com o Athena devem aplicar o protocolo do `s3` (por exemplo, `s3://amzn-s3-demo-bucket/folder/`). No Athena, os locais que usam outros protocolos (por exemplo, `s3a://amzn-s3-demo-bucket/folder/`) resultam em falhas nas consultas `MSCK REPAIR TABLE` quando elas são executadas nas tabelas que os contêm. 
+ Verifique se o caminho do Amazon S3 está em letras minúsculas, em vez de maiúsculas e minúsculas concatenadas (por exemplo, `userid` em vez de `userId`). Se o caminho do S3 estiver em maiúsculas e minúsculas concatenadas, o `MSCK REPAIR TABLE` não adicionará as partições ao AWS Glue Data Catalog. Para obter mais informações, consulte [MSCK REPAIR TABLE](msck-repair-table.md).
+ Como `MSCK REPAIR TABLE` verifica uma pasta e as subpastas para encontrar um esquema de partição correspondente, mantenha os dados das tabelas separadas em hierarquias de pastas separadas. Por exemplo, suponha que você tenha dados na tabela 1 em `s3://amzn-s3-demo-bucket1` e dados na tabela 2 em `s3://amzn-s3-demo-bucket1/table-2-data`. Se ambas as tabelas forem particionadas por string, `MSCK REPAIR TABLE` adicionará as partições da tabela 2 à tabela 1. Para evitar isso, use estruturas de pastas separadas, como `s3://amzn-s3-demo-bucket1` e `s3://amzn-s3-demo-bucket2`. Observe que esse comportamento é consistente com o Amazon EMR e o Apache Hive.
+ Se estiver usando o AWS Glue Data Catalog com o Athena, consulte [Endpoints e cotas do AWS Glue](https://docs.aws.amazon.com/general/latest/gr/glue.html) para obter informações sobre cotas de serviço em partições por conta e por tabela. 
  + Embora o Athena ofereça suporte a consulta a tabelas do AWS Glue com 10 milhões de partições, o Athena não pode ler mais de 1 milhão de partições em uma única varredura. Nesses cenários, a indexação de partições pode ser benéfica. Para obter mais informações, consulte o artigo do Blog de Big Data da AWS, [Melhorar a performance das consultas do Amazon Athena usando índices de partição do AWS Glue Data Catalog](https://aws.amazon.com/blogs/big-data/improve-amazon-athena-query-performance-using-aws-glue-data-catalog-partition-indexes/).
+ Para solicitar um aumento de cota de partições, se estiver usando o AWS Glue Data Catalog, acesse o [console do Service Quotas para o AWS Glue](https://console.aws.amazon.com/servicequotas/home?region=us-east-1#!/services/glue/quotas).

## Criar e carregar uma tabela com dados particionados
<a name="partitions-creating-loading"></a>

Para criar uma tabela que use partições, use a cláusula `PARTITIONED BY` na sua instrução [CREATE TABLE](create-table.md). A cláusula `PARTITIONED BY` define as chaves usadas para particionar dados, como no exemplo a seguir. A cláusula `LOCATION` especifica o local raiz dos dados particionados.

```
CREATE EXTERNAL TABLE users (
first string,
last string,
username string
)
PARTITIONED BY (id string)
STORED AS parquet
LOCATION 's3://amzn-s3-demo-bucket'
```

Depois de criar a tabela, carregue os dados nas partições para consulta. Para partições no estilo do Hive, você executa [MSCK REPAIR TABLE](msck-repair-table.md). Para partições que não seguem o estilo do Hive, use [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) para adicionar as partições manualmente.

## Preparar dados em estilo Hive e não Hive para consulta
<a name="partitions-preparing-data"></a>

As seções a seguir mostram como preparar dados de estilo do Hive e de estilo não Hive para consulta no Athena.

### Cenário 1: dados armazenados no Amazon S3 no formato Hive
<a name="scenario-1-data-already-partitioned-and-stored-on-s3-in-hive-format"></a>

Nesse cenário, as partições são armazenadas em pastas separadas no Amazon S3. Por exemplo, aqui está a listagem parcial para exemplos de impressões de anúncio exibidas pelo [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/ls.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/ls.html), que lista os objetos do S3 sob um prefixo especificado:

```
aws s3 ls s3://elasticmapreduce/samples/hive-ads/tables/impressions/

    PRE dt=2009-04-12-13-00/
    PRE dt=2009-04-12-13-05/
    PRE dt=2009-04-12-13-10/
    PRE dt=2009-04-12-13-15/
    PRE dt=2009-04-12-13-20/
    PRE dt=2009-04-12-14-00/
    PRE dt=2009-04-12-14-05/
    PRE dt=2009-04-12-14-10/
    PRE dt=2009-04-12-14-15/
    PRE dt=2009-04-12-14-20/
    PRE dt=2009-04-12-15-00/
    PRE dt=2009-04-12-15-05/
```

Aqui, os logs são armazenados com o nome da coluna (dt) definido igual a incrementos de data, hora e minuto. Quando especifica o local da pasta pai, o esquema e o nome da coluna particionada em uma DDL, o Athena pode consultar os dados nessas subpastas.

#### Criar a tabela
<a name="creating-a-table"></a>

Para gerar uma tabela com esses dados, crie uma partição com “dt”, como na seguinte instrução DDL do Athena:

```
CREATE EXTERNAL TABLE impressions (
    requestBeginTime string,
    adId string,
    impressionId string,
    referrer string,
    userAgent string,
    userCookie string,
    ip string,
    number string,
    processId string,
    browserCookie string,
    requestEndTime string,
    timers struct<modelLookup:string, requestTime:string>,
    threadId string,
    hostname string,
    sessionId string)
PARTITIONED BY (dt string)
ROW FORMAT  serde 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://elasticmapreduce/samples/hive-ads/tables/impressions/' ;
```

Esta tabela usa o serializador/desserializador JSON nativo do Hive para ler os dados JSON armazenados no Amazon S3. Para obter mais informações sobre os formatos compatíveis, consulte [Escolha de um SerDe para seus dados](supported-serdes.md).

#### Executar MSCK REPAIR TABLE
<a name="run-msck-repair-table"></a>

Depois de executar a consulta `CREATE TABLE`, execute o comando `MSCK REPAIR TABLE` no editor de consultas do Athena para carregar as partições, como no exemplo a seguir.

```
MSCK REPAIR TABLE impressions
```

Depois de executar esse comando, os dados estarão prontos para consulta.

#### Consultar os dados
<a name="query-the-data"></a>

Consulte os dados da tabela de impressões usando a coluna de partição. Veja um exemplo abaixo:

```
SELECT dt,impressionid FROM impressions WHERE dt<'2009-04-12-14-00' and dt>='2009-04-12-13-00' ORDER BY dt DESC LIMIT 100
```

Esta consulta deve mostrar dados semelhantes aos seguintes:

```
2009-04-12-13-20    ap3HcVKAWfXtgIPu6WpuUfAfL0DQEc
2009-04-12-13-20    17uchtodoS9kdeQP1x0XThKl5IuRsV
2009-04-12-13-20    JOUf1SCtRwviGw8sVcghqE5h0nkgtp
2009-04-12-13-20    NQ2XP0J0dvVbCXJ0pb4XvqJ5A4QxxH
2009-04-12-13-20    fFAItiBMsgqro9kRdIwbeX60SROaxr
2009-04-12-13-20    V4og4R9W6G3QjHHwF7gI1cSqig5D1G
2009-04-12-13-20    hPEPtBwk45msmwWTxPVVo1kVu4v11b
2009-04-12-13-20    v0SkfxegheD90gp31UCr6FplnKpx6i
2009-04-12-13-20    1iD9odVgOIi4QWkwHMcOhmwTkWDKfj
2009-04-12-13-20    b31tJiIA25CK8eDHQrHnbcknfSndUk
```

### Cenário 2: Os dados não são particionados no formato Hive
<a name="scenario-2-data-is-not-partitioned"></a>

No exemplo a seguir, o comando `aws s3 ls` mostra os logs [ELB](elasticloadbalancer-classic-logs.md) armazenados no Amazon S3. Observe como o layout de dados não usa pares `key=value` e, portanto, não está no formato Hive. (A opção `--recursive` para o comando `aws s3 ls` especifica que todos os arquivos ou objetos no diretório ou prefixo especificado serão listados.)

```
aws s3 ls s3://athena-examples-myregion/elb/plaintext/ --recursive

2016-11-23 17:54:46   11789573 elb/plaintext/2015/01/01/part-r-00000-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    8776899 elb/plaintext/2015/01/01/part-r-00001-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    9309800 elb/plaintext/2015/01/01/part-r-00002-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    9412570 elb/plaintext/2015/01/01/part-r-00003-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47   10725938 elb/plaintext/2015/01/01/part-r-00004-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    9439710 elb/plaintext/2015/01/01/part-r-00005-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47          0 elb/plaintext/2015/01/01_$folder$
2016-11-23 17:54:47    9012723 elb/plaintext/2015/01/02/part-r-00006-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    7571816 elb/plaintext/2015/01/02/part-r-00007-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    9673393 elb/plaintext/2015/01/02/part-r-00008-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   11979218 elb/plaintext/2015/01/02/part-r-00009-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48    9546833 elb/plaintext/2015/01/02/part-r-00010-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   10960865 elb/plaintext/2015/01/02/part-r-00011-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48          0 elb/plaintext/2015/01/02_$folder$
2016-11-23 17:54:48   11360522 elb/plaintext/2015/01/03/part-r-00012-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   11211291 elb/plaintext/2015/01/03/part-r-00013-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48    8633768 elb/plaintext/2015/01/03/part-r-00014-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49   11891626 elb/plaintext/2015/01/03/part-r-00015-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49    9173813 elb/plaintext/2015/01/03/part-r-00016-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49   11899582 elb/plaintext/2015/01/03/part-r-00017-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49          0 elb/plaintext/2015/01/03_$folder$
2016-11-23 17:54:50    8612843 elb/plaintext/2015/01/04/part-r-00018-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50   10731284 elb/plaintext/2015/01/04/part-r-00019-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    9984735 elb/plaintext/2015/01/04/part-r-00020-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    9290089 elb/plaintext/2015/01/04/part-r-00021-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    7896339 elb/plaintext/2015/01/04/part-r-00022-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8321364 elb/plaintext/2015/01/04/part-r-00023-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51          0 elb/plaintext/2015/01/04_$folder$
2016-11-23 17:54:51    7641062 elb/plaintext/2015/01/05/part-r-00024-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51   10253377 elb/plaintext/2015/01/05/part-r-00025-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8502765 elb/plaintext/2015/01/05/part-r-00026-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51   11518464 elb/plaintext/2015/01/05/part-r-00027-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    7945189 elb/plaintext/2015/01/05/part-r-00028-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    7864475 elb/plaintext/2015/01/05/part-r-00029-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51          0 elb/plaintext/2015/01/05_$folder$
2016-11-23 17:54:51   11342140 elb/plaintext/2015/01/06/part-r-00030-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8063755 elb/plaintext/2015/01/06/part-r-00031-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9387508 elb/plaintext/2015/01/06/part-r-00032-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9732343 elb/plaintext/2015/01/06/part-r-00033-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52   11510326 elb/plaintext/2015/01/06/part-r-00034-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9148117 elb/plaintext/2015/01/06/part-r-00035-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52          0 elb/plaintext/2015/01/06_$folder$
2016-11-23 17:54:52    8402024 elb/plaintext/2015/01/07/part-r-00036-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    8282860 elb/plaintext/2015/01/07/part-r-00037-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52   11575283 elb/plaintext/2015/01/07/part-r-00038-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53    8149059 elb/plaintext/2015/01/07/part-r-00039-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53   10037269 elb/plaintext/2015/01/07/part-r-00040-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53   10019678 elb/plaintext/2015/01/07/part-r-00041-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53          0 elb/plaintext/2015/01/07_$folder$
2016-11-23 17:54:53          0 elb/plaintext/2015/01_$folder$
2016-11-23 17:54:53          0 elb/plaintext/2015_$folder$
```

#### Executar ALTER TABLE ADD PARTITION
<a name="run-alter-table-add-partition"></a>

Como os dados não estão no formato Hive, você não pode usar o comando `MSCK REPAIR TABLE` para adicionar as partições à tabela depois de criá-la. Em vez disso, você pode usar o comando [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) para adicionar cada partição manualmente. Por exemplo, para carregar os dados em s3://athena-examples-*myregion*/elb/plaintext/2015/01/01/, execute a consulta a seguir. Observe que não é necessária uma coluna de partição separada para cada pasta do Amazon S3 e que o valor da chave da partição pode ser diferente da chave do Amazon S3.

```
ALTER TABLE elb_logs_raw_native_part ADD PARTITION (dt='2015-01-01') location 's3://athena-examples-us-west-1/elb/plaintext/2015/01/01/'
```

Se já existir uma partição, você receberá o erro de que a partição já existe. Para evitar esse erro, você pode usar a cláusula `IF NOT EXISTS`. Para obter mais informações, consulte [ALTER TABLE ADD PARTITION](alter-table-add-partition.md). Para remover uma partição, use [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md). 

## Considerar a projeção de partições
<a name="partitions-partition-projection"></a>

Para evitar a necessidade de gerenciar partições, é possível usar a projeção de partições. A projeção de partição é uma opção para tabelas altamente particionadas cuja estrutura é conhecida antecipadamente. Na projeção de partições, os valores e os locais das partições são calculados a partir das propriedades da tabela que foi configurada, não da leitura de um repositório de metadados. Como os cálculos na memória são mais rápidos do que a pesquisa remota, o uso da projeção de partição pode reduzir significativamente os tempos de execução da consulta. 

Para obter mais informações, consulte [Usar projeção de partições com o Amazon Athena](partition-projection.md).

## Recursos adicionais
<a name="partitions-additional-resources"></a>
+ Para obter informações sobre opções de particionamento para dados do Firehose, consulte [Exemplo do Amazon Data Firehose](partition-projection-kinesis-firehose-example.md).
+ Também é possível automatizar partições usando o [driver JDBC](connect-with-jdbc.md). 
+ É possível usar CTAS e INSERT INTO para particionar um conjunto de dados. Para obter mais informações, consulte [Usar CTAS e INSERT INTO para ETL e análise de dados](ctas-insert-into-etl.md).