Gravações frequentes em tabelas delta geram muitos arquivos pequenos, o que reduz o throughput de E/S e aumenta a pressão sobre o armazenamento. A compactação mescla todos os arquivos de dados em um conjunto consolidado de arquivos base, mantendo apenas a versão mais recente de cada linha. Assim, as consultas leem menos arquivos e executam com maior rapidez.
Visão geral
As tabelas delta oferecem suporte a dois métodos de mesclagem de dados:
|
Método |
Funcionamento |
Acionamento |
|
Clustering |
Mescla apenas arquivos delta em um arquivo maior, sem alterar o conteúdo dos dados. Os arquivos delta contêm dados de operações confirmadas. |
Automático — o sistema executa o clustering periodicamente com base no tamanho e na quantidade de arquivos. Nenhuma ação manual é necessária. |
|
Compaction |
Mescla todos os arquivos de dados em um lote de arquivos base. Para linhas com a mesma chave primária, apenas a linha mais recente é mantida. Versões históricas das linhas e dados de colunas do sistema não são retidos. |
Manual — execute |
Pré-requisitos
Antes de começar, verifique se você possui:
Uma tabela delta (criada com
tblproperties ("transactional"="true"))A propriedade de sessão
odps.merge.task.mode=servicedefinida na sua sessão
Sintaxe
ALTER TABLE <table_name>
[PARTITION (<partition_key> = '<partition_value>' [, ...])]
COMPACT MAJOR;
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Nome da tabela delta a ser compactada. |
|
|
Não |
Nome da chave de partição. Especifique para compactar uma única partição. |
|
|
Não |
Valor da chave de partição. |
Observações de uso
-
Propriedade de sessão obrigatória: Defina
odps.merge.task.mode=serviceantes de executar a compactação.SET odps.merge.task.mode=service; Custo de armazenamento: A compactação gera novos arquivos base antes de remover os antigos, o que aumenta temporariamente o uso do armazenamento. Configure uma frequência de acionamento adequada às necessidades do seu negócio.
Amplificação de gravação e conflitos: A política de compactação foi projetada para evitar amplificação grave de gravação e falhas causadas por conflitos em cenários de compactação frequente.
Faturamento
|
Método de faturamento |
Cobrança da compactação |
|
Pagamento conforme o uso |
|
|
Assinatura |
Deduzido da cota de computação da assinatura |
Exemplo
O exemplo a seguir cria uma tabela delta particionada, insere dados em três lotes, executa a compactação e, em seguida, consulta dados históricos usando time travel.
-- Create a delta table with a primary key and two partition columns.
CREATE TABLE mf_dt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT NOT NULL)
PARTITIONED BY (dd STRING, hh STRING)
TBLPROPERTIES ("transactional"="true");
-- Insert data in three batches to simulate incremental writes.
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (1, 1), (2, 2);
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (2, 20), (3, 3);
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (3, 30), (4, 4);
-- Run compaction on the partition.
SET odps.merge.task.mode=service;
ALTER TABLE mf_dt PARTITION(dd='01', hh='01') COMPACT MAJOR;
-- Query the latest snapshot after compaction.
SELECT * FROM mf_dt TIMESTAMP AS OF get_latest_timestamp('mf_dt')
WHERE dd='01' AND hh='01';
-- Query the second-to-latest snapshot (time travel still works after compaction).
SELECT * FROM mf_dt TIMESTAMP AS OF get_latest_timestamp('mf_dt', 2)
WHERE dd='01' AND hh='01';