Les écritures fréquentes dans les tables Delta génèrent de nombreux petits fichiers, ce qui réduit le débit des E/S et accroît la pression sur le stockage. La compaction fusionne tous les fichiers de données en un ensemble consolidé de fichiers de base, en ne conservant que la dernière version de chaque ligne. Ainsi, les requêtes analysent moins de fichiers et s'exécutent plus rapidement.
Vue d'ensemble
Les tables Delta prennent en charge deux méthodes de fusion des données :
| Méthode | Fonctionnement | Déclencheur |
|---|---|---|
| Clustering | Fusionne uniquement les fichiers delta en un fichier plus volumineux sans modifier le contenu des données. Les fichiers delta contiennent les données issues des opérations validées. | Automatique : le système exécute le clustering périodiquement en fonction de la taille et du nombre de fichiers. Aucune action manuelle n'est requise. |
| Compaction | Fusionne tous les fichiers de données en un lot de fichiers de base. Pour les lignes partageant la même clé primaire, seule la dernière ligne est conservée. Les versions historiques des lignes et les données des colonnes système ne sont pas conservées. | Manuel : exécutez ALTER TABLE ... COMPACT MAJOR. |
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une table Delta (créée avec
tblproperties ("transactional"="true"))La propriété de session
odps.merge.task.mode=servicedéfinie dans votre session
Syntaxe
ALTER TABLE <table_name>
[PARTITION (<partition_key> = '<partition_value>' [, ...])]
COMPACT MAJOR;
Paramètres
| Paramètre | Obligatoire | Description |
|---|---|---|
table_name |
Oui | Nom de la table Delta à compacter. |
partition_key |
Non | Nom de la clé de partition. Spécifiez ce paramètre pour compacter une seule partition. |
partition_value |
Non | Valeur de la clé de partition. |
Remarques d'utilisation
-
Propriété de session requise : Définissez
odps.merge.task.mode=serviceavant d'exécuter la compaction.SET odps.merge.task.mode=service; Coût de stockage : La compaction génère de nouveaux fichiers de base avant de supprimer les anciens, ce qui augmente temporairement l'utilisation du stockage. Vous pouvez configurer une fréquence de déclenchement adaptée à vos besoins métier.
Amplification des écritures et conflits : La politique de compaction est conçue pour éviter une amplification importante des écritures et les échecs causés par des conflits lors de compactations fréquentes.
Facturation
| Méthode de facturation | Modalités de facturation de la compaction |
|---|---|
| Paiement à l'utilisation | Amount of data scanned × 1 × unit price |
| Abonnement | Déduit du quota de calcul de l'abonnement |
Exemple
L'exemple suivant crée une table Delta partitionnée, insère des données en trois lots, exécute la compaction, puis interroge les données historiques en utilisant la fonctionnalité de voyage dans le temps (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';