O MaxCompute aprimora o formato Append Delta Table com suporte a Hash Cluster, melhorando o desempenho de consultas e permitindo o processamento incremental de dados. Este tópico aborda as diferenças em relação a outros tipos de tabela, detalhes de sintaxe e exemplos de uso para SQL e o Data Tunnel SDK.
Casos de uso
Recomenda-se o uso do Hash Cluster nos seguintes cenários:
Consultas com filtro de igualdade: utilize para buscas pontuais ou filtros de igualdade em colunas específicas e reduza a varredura de dados.
Equi-joins e operações GROUP BY: reduza o embaralhamento de dados ao unir ou agregar várias tabelas na mesma chave.
Comparação com tipos de tabela semelhantes
|
Tipo de tabela |
Método de clustering |
Gravação incremental (ACID) |
|
|
Hash |
Não suportado |
Oferece otimização de Hash Clustering (Shuffle + Sort), mas não suporta ACID. |
|
|
Hash |
Suportado |
Fornece capacidades ACID e otimização de Hash Clustering. Adequado para dados com chave primária. Apresenta desempenho de leitura e gravação inferior em comparação a tabelas sem chave primária. |
|
|
Range |
Suportado |
Oferece capacidades ACID e suporta recluster, mas o método de clustering Range resulta em desempenho de gravação inferior ao Hash. |
|
|
Append Delta Table - Hash Cluster |
Hash |
Suportado |
Combina a otimização de Hash Clustering (Shuffle + Sort) com capacidades ACID completas. Também suporta recluster incremental e completo em segundo plano, sendo a opção mais completa em recursos. |
Pré-requisitos
Antes de criar uma tabela, ative os seguintes parâmetros de sessão:
SET odps.table.append2.enable=true;
SET odps.table.hash.delta.enable=true; -- Enables the trial feature for creating hash delta tables.
Sintaxe
CREATE TABLE [IF NOT EXISTS] <table_name>
[(<col_name> <data_type> [comment <col_comment>], ...)]
[PARTITIONED BY (<col_name> <data_type> [comment <col_comment>], ...)]
CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [, <col_name>, ...])] -- Only ascending order is supported.
INTO <number_of_buckets> BUCKETS
TBLPROPERTIES ('table.format.version' = '2');
Parâmetros
|
Parâmetro |
Descrição |
|
|
Especifica as colunas de bucketing. Escolha colunas frequentemente usadas em consultas com filtro de igualdade, equi-joins, GROUP BY ou cláusulas WINDOW PARTITION BY. Para obter melhores resultados, selecione colunas com alta cardinalidade para garantir uma distribuição uniforme dos dados entre os buckets. |
|
|
Opcional. Define as colunas de ordenação dentro de cada bucket. Atualmente, apenas a ordem crescente é suportada. Recomendamos escolher colunas usadas para filtros de intervalo ou igualdade, cálculos de janela ou timestamps de versionamento. |
|
|
Define o número de buckets lógicos. Recomendamos definir esse valor com base no volume de dados, na concorrência de consultas e na cardinalidade das colunas de bucketing. A quantidade de buckets afeta o paralelismo das operações de gravação e as otimizações de shuffle durante a leitura. |
|
|
Defina como |
Exemplos de SQL
Este exemplo utiliza uma tabela de versão de status e preço de product. Na lógica de negócios, buscas pontuais ou joins são normalmente executados em produtos com base no item_id. Portanto, o item_id é designado como a coluna de bucketing por hash. O tempo de vigência da versão, event_time, rastreia alterações históricas; assim, o event_time é definido como a coluna de ordenação. Esse design é adequado para cenários como tabelas de Dimensão de Mudança Lenta (SCD), tabelas de versão de preço de product e tabelas de detalhes de alteração de status.
Preparação
SET odps.sql.type.system.odps2=true;
SET odps.table.append2.enable=true;
SET odps.table.hash.delta.enable=true;
Criar uma tabela
Tabela não particionada
CREATE TABLE hash_delta_sales_demo (
item_id BIGINT,
event_time TIMESTAMP,
price DOUBLE,
status STRING
)
CLUSTERED BY (item_id)
SORTED BY (event_time)
INTO 256 BUCKETS
TBLPROPERTIES ('table.format.version' = '2');
Tabela particionada
Para gerenciar dados por data, crie uma tabela particionada:
CREATE TABLE hash_delta_sales_demo_pt (
item_id BIGINT,
event_time TIMESTAMP,
price DOUBLE,
status STRING
)
PARTITIONED BY (ds STRING)
CLUSTERED BY (item_id)
SORTED BY (event_time)
INTO 256 BUCKETS
TBLPROPERTIES ('table.format.version' = '2');
Execute DESC EXTENDED hash_delta_sales_demo; para visualizar as informações da tabela. As definições de bucketing e ordenação da tabela são as seguintes:
ClusterType: hash
BucketNum: 256
ClusterColumns: [item_id]
SortColumns: [event_time ASC]
Gravações incrementais
Os exemplos a seguir utilizam uma tabela não particionada para demonstrar gravações incrementais e reclustering.
-
Gravação inicial de dados
INSERT INTO TABLE hash_delta_sales_demo VALUES (1001, TIMESTAMP '2026-05-01 10:00:00', 10.00, 'active'), (1001, TIMESTAMP '2026-05-03 10:00:00', 13.00, 'active'), (1002, TIMESTAMP '2026-05-01 11:00:00', 20.00, 'active'); DESC EXTENDED hash_delta_sales_demo; -
Operação de exclusão
Verifique o status da tabela após excluir alguns dados:
DELETE FROM hash_delta_sales_demo WHERE item_id = 1002; DESC EXTENDED hash_delta_sales_demo; -
Backfill de dados históricos
Faça o backfill de uma versão histórica. O event_time desta versão situa-se entre os timestamps existentes para item_id=1001:
INSERT INTO TABLE hash_delta_sales_demo VALUES (1001, TIMESTAMP '2026-05-02 09:00:00', 12.00, 'active'); DESC EXTENDED hash_delta_sales_demo;
Bucket pruning
Ao executar uma consulta com filtro de igualdade em uma coluna de bucketing, o MaxCompute usa a distribuição hash para localizar diretamente o bucket alvo e evita a varredura dos demais buckets. A consulta a seguir filtra por item_id = 1001 e lê apenas o bucket lógico que contém esse valor, evitando uma varredura completa da tabela:
SELECT * FROM hash_delta_sales_demo
WHERE item_id = 1001
ORDER BY event_time
LIMIT 10;
-- Returns:
+------------+---------------------+------------+--------+
| item_id | event_time | price | status |
+------------+---------------------+------------+--------+
| 1001 | 2026-05-01 10:00:00 | 10.0 | active |
| 1001 | 2026-05-02 09:00:00 | 12.0 | active |
| 1001 | 2026-05-03 10:00:00 | 13.0 | active |
+------------+---------------------+------------+--------+
Recluster completo
Para reorganizar os dados existentes, execute RECLUSTER FULL. Essa operação preserva a semântica dos dados históricos na tabela e reorganiza os dados armazenados conforme a definição atual da tabela.
ALTER TABLE hash_delta_sales_demo RECLUSTER FULL;
DESC EXTENDED hash_delta_sales_demo;
Uma Append Delta Table com Hash Cluster suporta operações de gravação incremental como INSERT, UPDATE, DELETE e MERGE INTO, preservando a distribuição hash. O otimizador escolhe um plano de execução com base no estado atual dos dados. Ele aproveita o armazenamento ordenado quando os dados estão classificados e recorre ao bucketing por hash quando os dados não estão totalmente ordenados. Execute RECLUSTER FULL a qualquer momento para restaurar a ordem de classificação completa.
Exemplo do Data Tunnel SDK
Esta seção mostra como usar o Data Tunnel SDK para carregar e baixar dados da tabela hash_delta_sales_demo.
-
Importe a dependência do SDK
Use a versão 0,59 ou posterior. Para mais detalhes, consulte as Notas de Lançamento.
-
Código de exemplo
FAQ
Escolha do tamanho de armazenamento do bucket
O tamanho de armazenamento recomendado para um único bucket varia de algumas centenas de megabytes a dezenas de gigabytes.
Buckets pequenos aumentam a sobrecarga de armazenamento e os custos de shuffle.
Buckets grandes prolongam o tempo de gravação e reduzem a eficácia do Bucket Pruning e das otimizações de shuffle.
Defina o número de buckets com base no crescimento esperado dos dados, e não apenas no volume atual, para evitar modificações frequentes na estrutura da tabela.
Se o volume de dados for excepcionalmente grande, um único bucket pode suportar mais armazenamento ou você pode definir um número maior de buckets. No entanto, avalie o impacto no desempenho de gravação e consulta com base no seu caso de uso específico.