A compactação mescla todos os arquivos de dados com base em uma política específica para melhorar a eficiência das consultas.
Recursos
As Delta Tables suportam gravações incrementais em tempo quase real e consultas com time travel. Gravações frequentes de dados geram muitos arquivos pequenos. Uma política de mesclagem eficiente combina esses arquivos pequenos e remove dados duplicados. Esse processo melhora a eficiência de E/S e reduz a carga no sistema de armazenamento. No entanto, compactações frequentes podem causar amplificação intensa de gravação e falhas por conflito.
Atualmente, o sistema oferece suporte a dois métodos de mesclagem de dados:
Clustering: mescla os DeltaFiles confirmados em um único arquivo grande, sem alterar os dados. O sistema executa esse processo periodicamente com base no tamanho e na quantidade de novos arquivos. Não é necessário executá-lo manualmente. O clustering resolve principalmente problemas de eficiência e estabilidade de E/S causados por arquivos pequenos.
Compactação: mescla todos os arquivos de dados com base em uma política específica para gerar novos BaseFiles. O sistema armazena apenas o estado mais recente para linhas de dados com a mesma chave primária (PK). O processo não inclui estados históricos nem informações de colunas do sistema. O principal objetivo da compactação é melhorar a eficiência das consultas.
Sintaxe
alter table <table_name> [partition
(<partition_key> = '<partition_value>' [, ...])
]
compact major;
Notas
-
Para executar a compactação manualmente, defina a seguinte flag.
set odps.merge.task.mode=service; A compactação cria novos arquivos. Embora essa operação melhore a eficiência das consultas, ela também aumenta os custos de armazenamento. Escolha uma frequência de acionamento que equilibre esses fatores para o seu cenário específico.
A compactação consome recursos de computação para ler e reescrever dados. Se você utilizar o método de faturamento de pagamento conforme o uso, haverá cobrança pela compactação. O sistema calcula o custo da seguinte forma: Volume de dados escaneados × 1 × Preço unitário. Caso utilize o método de faturamento por assinatura, a compactação consumirá a cota de recursos de computação da sua assinatura.
Exemplos
--Create a table
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
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. After the operation completes, you can still query historical data.
set odps.merge.task.mode=service;
alter table mf_dt partition(dd='01', hh='01') compact major;
select * from mf_dt timestamp as of get_latest_timestamp('mf_dt') where dd='01' and hh='01';
select * from mf_dt timestamp as of get_latest_timestamp('mf_dt', 2) where dd='01' and hh='01';