

# Usar particionamento e bucketing
<a name="ctas-partitioning-and-bucketing"></a>

O particionamento e o bucketing são duas formas de reduzir a quantidade de dados que o Athena deve verificar quando você executa uma consulta. O particionamento e o bucketing são complementares e podem ser usados em conjunto. Reduzir a quantidade de dados verificados gera uma performance melhor a um custo menor. Para obter diretrizes gerais sobre a performance das consultas do Athena, consulte [As dez melhores dicas de ajuste de performance para o Amazon Athena](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/).

**Topics**
+ [O que é particionamento?](ctas-partitioning-and-bucketing-what-is-partitioning.md)
+ [O que é bucketing?](ctas-partitioning-and-bucketing-what-is-bucketing.md)
+ [Recursos adicionais](ctas-partitioning-and-bucketing-additional-resources.md)

# O que é particionamento?
<a name="ctas-partitioning-and-bucketing-what-is-partitioning"></a>

Particionamento significa organizar dados em diretórios (ou “prefixos”) no Amazon S3 com base em uma propriedade específica dos dados. Essas propriedades são chamadas chaves de partição. Uma chave de partição comum é a data ou alguma outra unidade de tempo, como ano ou mês. Porém, um conjunto de dados pode ser particionado por mais de uma chave. Por exemplo, dados sobre vendas de produtos podem ser divididos por data, categoria do produto e mercado.

## Decidir como particionar
<a name="ctas-partitioning-and-bucketing-deciding-how-to-partition"></a>

Bons candidatos para chaves de partição são as propriedades que sempre ou quase sempre são usadas em consultas e têm baixa cardinalidade. Há um equilíbrio entre ter partições em excesso e não ter partições suficientes. Com partições em excesso, o aumento do número de arquivos cria sobrecarga. Também há sobrecarga na filtragem das partições em si. Com poucas partições, as consultas geralmente precisam verificar mais dados.

## Criar uma tabela particionada
<a name="ctas-partitioning-and-bucketing-creating-a-partitioned-table"></a>

Quando um conjunto de dados é particionado, é possível criar uma tabela particionada no Athena. Uma tabela particionada é uma tabela que contém chaves de partição. Ao usar `CREATE TABLE`, você adiciona partições à tabela. Quando você usa `CREATE TABLE AS`, as partições criadas no Amazon S3 são adicionadas automaticamente à tabela.

Em uma instrução `CREATE TABLE`, você especifica as chaves de partição na cláusula `PARTITIONED BY (column_name data_type)`. Em uma instrução `CREATE TABLE AS`, você especifica as chaves de partição em uma cláusula `WITH (partitioned_by = ARRAY['partition_key'])` ou `WITH (partitioning = ARRAY['partition_key'])` para tabelas Iceberg. Por questões de performance, as chaves de partição devem ser sempre do tipo `STRING`. Para obter mais informações, consulte [Usar string como o tipo de dados para chaves de partição](data-types-timestamps.md#data-types-timestamps-partition-key-types).

Para obter mais detalhes de sintaxe de `CREATE TABLE` e `CREATE TABLE AS`, consulte [CREATE TABLE](create-table.md) e [Propriedades da tabela CTAS](create-table-as.md#ctas-table-properties).

## Consultar tabelas particionadas
<a name="ctas-partitioning-and-bucketing-querying-partitioned-tables"></a>

Quando você consulta uma tabela particionada, o Athena usa os predicados da consulta para filtrar a lista de partições. Em seguida, ele utiliza os locais das partições correspondentes para processar os arquivos encontrados. O Athena pode reduzir com eficiência a quantidade de dados verificados simplesmente não lendo dados nas partições que não correspondam aos predicados da consulta.

### Exemplos
<a name="ctas-partitioning-and-bucketing-partitioned-table-example-queries"></a>

Suponha que você tenha uma tabela particionada por `sales_date` e `product_category` e queira saber a receita total de uma semana em uma categoria específica. Inclua predicados nas colunas`sales_date` e `product_category` para garantir que o Athena verificará somente a quantidade mínima de dados, como no exemplo a seguir.

```
SELECT SUM(amount) AS total_revenue 
FROM sales 
WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' 
AND product_category = 'Toys'
```

Suponha que você tenha um conjunto de dados que seja particionado por data, mas também tenha um carimbo de data e hora refinado.

Com as tabelas Iceberg, é possível declarar que uma chave de partição tem uma relação com uma coluna, mas com as tabelas Hive, o mecanismo de consulta não tem conhecimento das relações entre colunas e chaves de partição. Por esse motivo, é necessário incluir um predicado na coluna e na chave de partição da consulta para garantir que a consulta não verifique mais dados do que o necessário.

Por exemplo, suponha que a tabela `sales` no exemplo anterior também tenha uma coluna `sold_at` do tipo de dados `TIMESTAMP`. Se você quiser somente a receita de um intervalo de tempo específico, escreva a consulta da seguinte forma:

```
SELECT SUM(amount) AS total_revenue 
FROM sales 
WHERE sales_date = '2023-02-28' 
AND sold_at BETWEEN TIMESTAMP '2023-02-28 10:00:00' AND TIMESTAMP '2023-02-28 12:00:00' 
AND product_category = 'Toys'
```

Para obter mais informações sobre a diferença entre consultar tabelas Hive e Iceberg, consulte [Como gravar consultas em campos de timestamp que também são particionados por tempo](data-types-timestamps.md#data-types-timestamps-how-to-write-queries-for-timestamp-fields-that-are-also-time-partitioned).

# O que é bucketing?
<a name="ctas-partitioning-and-bucketing-what-is-bucketing"></a>

Bucketing é uma forma de organizar os registros de um conjunto de dados em categorias chamadas buckets.

Esse significado de bucket e bucketing é diferente dos buckets do Amazon S3 e não devem ser confundidos. No bucketing de dados, os registros que têm o mesmo valor para uma propriedade vão para o mesmo bucket. Os registros são distribuídos da forma mais uniforme possível entre os buckets, de modo que cada bucket tenha aproximadamente a mesma quantidade de dados.

Na prática, os buckets são arquivos, e uma função de hash determina o bucket em que um registro entrará. Um conjunto de dados em bucket terá um ou mais arquivos por bucket por partição. O bucket ao qual um arquivo pertence está codificado no nome do arquivo.

## Benefícios do bucketing
<a name="ctas-partitioning-and-bucketing-bucketing-benefits"></a>

O bucketing é útil quando um conjunto de dados é classificado em bucket por determinada propriedade, e convém recuperar registros nos quais essa propriedade tenha determinado valor. Como os dados estão em buckets, o Athena pode usar o valor para determinar quais arquivos examinar. Por exemplo, suponha que um conjunto de dados esteja em buckets `customer_id` e você queira localizar todos os registros de um cliente específico. O Athena determina o bucket que contém os registros e lê somente os arquivos desse bucket.

Bons candidatos para bucketing ocorrem quando há colunas que têm alta cardinalidade (ou seja, com muitos valores distintos), estão uniformemente distribuídas e que você frequentemente consulta buscando valores específicos.

**nota**  
O Athena não é compatível com o uso de `INSERT INTO` para adicionar novos registros a tabelas em bucket.

## Tipos de dados compatíveis com a filtragem em colunas em bucket
<a name="ctas-partitioning-and-bucketing-data-types-supported-for-filtering-on-bucketed-columns"></a>

É possível adicionar filtros em colunas classificadas por buckets com determinados tipos de dados. O Athena permite essa filtragem nas colunas em bucket com os seguintes tipos de dados:
+ BOOLEAN
+ BYTE
+ DATE
+ DOUBLE
+ FLOAT
+ INT
+ LONG
+ SHORT
+ STRING
+ VARCHAR

## Compatível com Hive e Spark
<a name="ctas-partitioning-and-bucketing-hive-and-spark-support"></a>

O mecanismo Athena versão 2 é compatível com conjuntos de dados em buckets usando o algoritmo de bucket do Hive, e o mecanismo Athena versão 3 também é compatível com o algoritmo de bucketing do Apache Spark. O bucketing Hive é o padrão. Se seu conjunto de dados for classificado em buckets usando o algoritmo Spark, use a cláusula `TBLPROPERTIES` para definir o valor da propriedade `bucketing_format` como `spark`.

**nota**  
O Athena tem um limite de 100 partições em uma consulta `CREATE TABLE AS SELECT` ([CTAS](ctas.md)). Da mesma forma, é possível adicionar apenas, no máximo, 100 partições a uma tabela de destino com uma instrução [INSERT INTO](insert-into.md).  
Se exceder essa limitação, você poderá receber a mensagem de erro HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets (Limite excedido de 100 gravadores abertos para partições/buckets). Para contornar essa limitação, é possível usar uma instrução CTAS e uma série de instruções `INSERT INTO` que criam ou inserem até 100 partições cada. Para obter mais informações, consulte [Usar CTAS e INSERT INTO para resolver o limite de 100 partições](ctas-insert-into.md).

## Exemplo de CREATE TABLE para bucketing
<a name="ctas-partitioning-and-bucketing-bucketing-create-table-example"></a>

Para criar uma tabela para um conjunto de dados em buckets existente, use a cláusula `CLUSTERED BY (column)` seguida da cláusula `INTO N BUCKETS`. A cláusula `INTO N BUCKETS` especifica o número de buckets nos quais os dados são classificados.

No exemplo de `CREATE TABLE` a seguir, o conjunto de dados `sales` é classificado por `customer_id` em oito buckets usando o algoritmo Spark. A instrução `CREATE TABLE` usa as cláusulas`CLUSTERED BY` e `TBLPROPERTIES` para definir as propriedades adequadamente.

```
CREATE EXTERNAL TABLE sales (...) 
... 
CLUSTERED BY (`customer_id`) INTO 8 BUCKETS 
... 
TBLPROPERTIES ( 
  'bucketing_format' = 'spark' 
)
```

## Exemplo de CREATE TABLE AS (CTAS) para bucketing
<a name="ctas-partitioning-and-bucketing-bucketing-create-table-as-example"></a>

Para especificar o bucketing com `CREATE TABLE AS`, use os parâmetros `bucketed_by` e `bucket_count`, como no exemplo a seguir.

```
CREATE TABLE sales 
WITH ( 
  ... 
  bucketed_by = ARRAY['customer_id'], 
  bucket_count = 8 
) 
AS SELECT ...
```

## Exemplo de consulta de bucketing
<a name="ctas-partitioning-and-bucketing-bucketing-query-example"></a>

O exemplo de consulta a seguir pesquisa os nomes dos produtos que um cliente específico comprou ao longo de uma semana.

```
SELECT DISTINCT product_name 
FROM sales 
WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' 
AND customer_id = 'c123'
```

Se essa tabela for particionada por `sales_date` e classificada em buckets por `customer_id`, o Athena poderá calcular o bucket em que os registros do cliente estão. No máximo, o Athena lê um arquivo por partição.

# Recursos adicionais
<a name="ctas-partitioning-and-bucketing-additional-resources"></a>
+ Para obter um exemplo de `CREATE TABLE AS` que cria tabelas em bucket e particionadas, consulte [Exemplo: criar tabelas em bucket e particionadas](https://docs.aws.amazon.com/athena/latest/ug/ctas-examples.html#ctas-example-bucketed).
+ Para obter informações sobre a implementação de buckets em data lakes do AWS, incluindo o uso de uma declaração CTAS do Athena, AWS Glue para o Apache Spark e buckets para tabelas do Apache Iceberg, consulte a postagem do blog do AWS Big Data: [Optimize data layout by bucketing with Amazon Athena and AWS Glue to accelerate downstream queries](https://aws.amazon.com/blogs/big-data/optimize-data-layout-by-bucketing-with-amazon-athena-and-aws-glue-to-accelerate-downstream-queries/). 