View a markdown version of this page

Commandes SQL - Amazon Redshift

Amazon Redshift ne prendra plus en charge l'utilisation des UDF Python après le 30 juin 2026. Nous allons commencer à l'appliquer par étapes. Pour plus d'informations sur les détails de la fin de vie de Python et des options de migration, consultez le billet de blog publié le 30 juin 2025.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Commandes SQL

Les tables Apache Iceberg d'Amazon Redshift constituent un moyen puissant de gérer de grands ensembles de données analytiques dans votre lac de données. Ces tables prennent en charge les transactions ACID, l'évolution des schémas et les fonctionnalités de voyage dans le temps tout en maintenant des performances élevées pour les charges de travail analytiques. Les tables Apache Iceberg vous permettent d'organiser et de partitionner efficacement vos données, de contrôler les formats de fichiers et leur compression, et de les intégrer facilement à d'autres AWS services.

Vous pouvez créer des tables Iceberg partitionnées et non partitionnées à l'aide des commandes et. CREATE TABLE ... USING ICEBERG CREATE TABLE ... USING ICEBERG AS SELECT Vous pouvez référencer des tables Iceberg à l'aide d'une notation de schéma externe (external_schema.table_name) ou d'une notation en trois parties ("catalog_name".database_name.table_name). Les exemples de cette section illustrent les deux méthodes.

Après avoir créé un tableau, vous pouvez ajouter des données à l'aide de INSERT commandes standard. N'oubliez pas que même si Amazon Redshift fonctionne avec de nombreux types de données Iceberg, vous devrez peut-être convertir certains formats de données lors de l'insertion d'informations.

Vous pouvez afficher les tables Iceberg à l'aide de SHOW TABLES la commande. Si vous souhaitez supprimer un tableau du AWS Glue Data Catalog, vous pouvez utiliser la DROP TABLE commande. Notez que cela supprime uniquement l'enregistrement de la table. Les données réelles resteront stockées jusqu'à ce que vous les supprimiez séparément.

Vous pouvez également modifier les données existantes à l'aide des MERGE commandes DELETEUPDATE, et. Pour modifier les définitions de tables telles que le schéma, les spécifications de partition et les propriétés, consultezModifier les définitions des tables. Les autres instructions DDL non documentées ne sont pas prises en charge pour les tables Iceberg.

Il est possible que vous écriviez dans une table Iceberg qui n'est pas créée par Amazon Redshift. Il existe toutefois certaines limites :

  • La table doit être une table Iceberg v2 ou v3.

  • Le tableau doit utiliser Parquet comme format de données par défaut.

  • La compression des métadonnées de la table ne doit pas être définie sur True.

  • La table ne doit pas être activée Write-Audit-Publish (WAP).

Les sections suivantes présentent la syntaxe SQL pour créer, insérer, modifier et gérer des tables Iceberg dans Amazon Redshift.

CREATE TABLE

CREATE TABLE [IF NOT EXISTS] <external_schema>.<table_name> ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]

Vous pouvez également utiliser la notation en trois parties pour les compartiments de tables S3 :

CREATE TABLE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]

Pour le catalogue awsdatacatalog racine monté automatiquement :

CREATE TABLE awsdatacatalog.<database_name>.<table_name> ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/' [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]

Lorsque vous utilisez la syntaxe du schéma externe, notez qu'<external_schema>il doit s'agir d'un nom de schéma externe existant dans lequel la table externe sera créée. Pour plus d'informations sur la création et la gestion de schémas externes, consultez la section CRÉER UN SCHÉMA EXTERNE dans la documentation Amazon Redshift.

La LOCATION clause définit l'emplacement de la table pour cette table Iceberg nouvellement créée. LOCATIONest obligatoire pour les tables créées à l'aide de schémas externes ou du catalogue awsdatacatalog racine. Il doit s'agir d'un emplacement vide, ce qui signifie qu'aucun objet Amazon S3 existant ne partage le même compartiment et le même préfixe. La région du compartiment Amazon S3 doit se trouver dans la même région que le cluster Amazon Redshift. Pour les compartiments de tables Amazon S3, cela LOCATION ne peut pas être spécifié car l'emplacement de la table est déterminé par le catalogue de tables Amazon S3 (s3tablescatalog).

Cependant, AWS fournit une méthode pour répliquer les données des tables Iceberg stockées AWS Glue Data Catalog dans une seule Région AWS vers une autre Région AWS, ce qui vous permet de répliquer l'écriture dans une autre région. Pour plus d'informations, consultez la section Répliquer les données entre elles Régions AWS.

PARTITIONED BYdéfinit la partition de la table Iceberg. Amazon Redshift prend en charge toutes les transformations de partition Iceberg v2, à l'exception de. void Voici la liste des transformations prises en charge :

  • identité

  • seau [N]

  • tronquer [W]

  • année

  • mois

  • day

  • heure

Pour les définitions complètes de ces transformations et des types de données compatibles, consultez la section Partition Transforms dans la documentation Apache Iceberg.

Il PARTITIONED BY prend en charge le partitionnement à plusieurs niveaux. Par exemple, vous pouvez exécuter la commande suivante :

CREATE TABLE ... USING ICEBERG LOCATION ... PARTITIONED BY (bucket(16, id), year(ship_date));

Amazon Redshift ne prend toutefois pas en charge l'utilisation d'une seule colonne dans plusieurs transformations. Par exemple, la syntaxe suivante n'est pas prise en charge :

CREATE TABLE ... USING ICEBERG LOCATION ... PARTITIONED BY (bucket(16, ship_date), year(ship_date));

La TABLE PROPERTIES clause définit les propriétés supplémentaires de cette table Iceberg. Les propriétés de table prises en charge sont format-version etcompression_type. La format-version propriété spécifie la version du format de table Iceberg. Les valeurs possibles sont '2' (par défaut) et'3'. La compression_type propriété définit la compression par défaut du fichier de données Parquet. S'il n'est pas spécifié, snappy est utilisé comme codec de compression. Les valeurs possibles compression_type sont les suivantes : zstd brotligzip,snappy, etuncompressed.

Pour les tables Iceberg v3, vous pouvez spécifier des valeurs par défaut pour les colonnes à l'aide du mot clé DEFAULT. Les valeurs de colonne par défaut ne sont prises en charge que pour les tables Iceberg v3. Amazon Redshift renvoie une erreur si vous spécifiez une valeur par défaut dans une table Iceberg v2. Seules les valeurs littérales sont prises en charge par défaut.

CREATE TABLE <external_schema>.<table_name> ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/' [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('format-version'='3' [, 'compression_type'='<compression_value>'])];

Exemples avec valeurs par défaut :

-- External schema notation CREATE TABLE my_external_schema.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3'); -- Three-part notation (awsdatacatalog / Glue) CREATE TABLE awsdatacatalog.my_glue_db.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3'); -- Three-part notation (S3 Table Buckets) CREATE TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG TABLE PROPERTIES ('format-version'='3');
Note

CREATE TABLE ... LIKE ...n'est pas pris en charge pour les tables Iceberg. Les tables Iceberg ne prennent pas non plus en charge les contraintes de colonne et les attributs de colonne comme le fait la table RMS.

Vous pouvez également créer et remplir une table Iceberg en une seule opération en utilisant : CREATE TABLE AS SELECT

CREATE TABLE AS SELECT

CREATE TABLE <external_schema>.<table_name> [( column_name[, ...] )] USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression-value>')] AS SELECT query

Vous pouvez également utiliser la notation en trois parties pour créer des tableaux dans des catalogues montés automatiquement :

CREATE TABLE "<catalog_name>".<database_name>.<table_name> [( column_name[, ...] )] USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression-value>')] AS SELECT query

Elle est similaire à l'CREATE TABLEinstruction, sauf qu'elle CREATE est suivie d'une SELECT instruction pour remplir le tableau avec les résultats de la SELECT requête.

Vous ne pouvez plus spécifier les types de données à l'aide de la CREATE TABLE clause ici, car la SELECT requête détermine les types de données des colonnes.

Si la SELECT requête échoue pour une raison quelconque, cette requête échouera et la table Iceberg ne sera pas créée.

Pour les tables Iceberg v3, spécifiez 'format-version'='3' dans la clause TABLE PROPERTIES. Les valeurs de colonne par défaut ne sont pas héritées de la table source.

-- External schema notation CREATE TABLE my_external_schema.orders_backup ( order_id, status, region ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders-backup/' TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM my_external_schema.orders; -- Three-part notation (awsdatacatalog / Glue) CREATE TABLE awsdatacatalog.my_glue_db.orders_backup ( order_id, status, region ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders-backup/' TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM awsdatacatalog.my_glue_db.orders; -- Three-part notation (S3 Table Buckets) CREATE TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders_backup ( order_id, status, region ) USING ICEBERG TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders;

Vous pouvez consulter la structure de vos tables Iceberg en utilisant SHOW TABLE :

SHOW TABLE

SHOW TABLE <external_schema>.<table_name>

Vous pouvez également utiliser la notation en trois parties avec les catalogues montés automatiquement :

SHOW TABLE "<catalog_name>".<database_name>.<table_name>

SHOW TABLEaffiche la CREATE TABLE déclaration pour la table Iceberg. La commande affichera les résultats appropriés en fonction du type de tableau. Voici un exemple de SHOW TABLE sortie pour la table Iceberg :

CREATE TABLE my_schema.items (id int, price decimal(5, 2)) USING ICEBERG LOCATION 's3://my_s3_bucket/items/' PARTITIONED BY (bucket(16, id)) TABLE PROPERTIES ('compression_type'='snappy')
Note

Pour les tables Amazon S3, étant donné que l'emplacement des tables est géré par le catalogue de tables Amazon S3, la LOCATION clause sera omise dans les SHOW TABLE résultats.

Pour les tableaux Iceberg v3, SHOW TABLE affiche les valeurs de colonne par défaut dans sa sortie.

SHOW TABLE my_external_schema.orders; -- Output includes the default values in the column definitions: CREATE TABLE my_external_schema.orders ( id int, status varchar DEFAULT 'active', priority int DEFAULT 0 ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3');

Après avoir créé des tableaux, vous pouvez ajouter des données en utilisant INSERT INTO :

INSERT INTO

INSERT INTO <external_schema>.<table_name> [(column_name [, ...])] VALUES (...) INSERT INTO <external_schema>.<table_name> [(column_name [, ...])] (SELECT query) -- Using three-part notation for S3 table buckets: INSERT INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [(column_name [, ...])] VALUES (...) INSERT INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [(column_name [, ...])] (SELECT query) -- Using three-part notation for the awsdatacatalog root catalog: INSERT INTO awsdatacatalog.<database_name>.<table_name> [(column_name [, ...])] VALUES (...) INSERT INTO awsdatacatalog.<database_name>.<table_name> [(column_name [, ...])] (SELECT query)

Vous pouvez créer INSERT INTO une table Iceberg en utilisant la syntaxe ci-dessus. Si une VALUES clause est utilisée, vous fournissez les valeurs des colonnes répertoriées parcolumn_name, ou de toutes les colonnes si column_name une partie est omise.

Lorsque des données sont insérées dans une table partitionnée, les nouvelles lignes sont distribuées conformément à la spécification de partition prédéfinie. Si, pour une raison quelconque, la SELECT requête échoue, elle échouera et aucune donnée ne sera insérée dans la table Iceberg.

Pour les tables Iceberg v3 avec des valeurs de colonne par défaut, si une colonne avec une valeur par défaut est omise dans l'instruction INSERT ou si DEFAULT est spécifiée comme valeur, la valeur par défaut est écrite dans le fichier de données.

DELETE

La DELETE requête pour la table Iceberg utilise la DELETE syntaxe existante dans la table RMS :

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] DELETE [ FROM ] iceberg_table [ { USING } table_name, ... ] [ WHERE condition ]

Vous pouvez également utiliser la notation en trois parties pour les compartiments de tables S3 :

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] DELETE [ FROM ] "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [ { USING } table_name, ... ] [ WHERE condition ]

Pour le catalogue awsdatacatalog racine monté automatiquement :

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] DELETE [ FROM ] awsdatacatalog.<database_name>.<table_name> [ { USING } table_name, ... ] [ WHERE condition ]

Il iceberg_table peut être référencé à l'aide du <external_schema>.<external_table_name> formulaire ou utiliser la notation en 3 parties pour le catalogue monté automatiquement. Consultez la section Référencement des tables Iceberg dans Amazon Redshift.

La USING clause table_name in the sera utilisée pour joindre la table cible afin de supprimer les lignes qui satisfont à la WHERE condition. Il table_name peut s'agir d'une table Iceberg ou d'une table Amazon Redshift RMS.

Comme Iceberg utilise un schéma de partition caché, l'utilisateur peut utiliser DELETE une requête pour supprimer des partitions, obtenant le même effet que ALTER TABLE ... DROP PARTITION ... pour les tables Hive.

Par exemple, considérez une table Iceberg partitionnée comme suit :

CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date;

Vous pouvez ensuite supprimer une partition en utilisant une requête comme celle-ci :

DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';

Pour des requêtes de ce type, Amazon Redshift optimise l'exécution afin de n'effectuer que des opérations liées aux métadonnées et de court-circuiter l'exécution. Ainsi, contrairement à une DELETE requête normale, la requête de suppression des métadonnées uniquement n'affiche pas les étapes d'exécution dans EXPLAIN :

explain DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231'; QUERY PLAN ------------ "XN Seq Scan Metadata of my_external_schema.lineitem location: "s3://s3-path//table-location" format:ICEBERG (cost=0.00..0.01 rows=0 width=0)" (0 rows)

UPDATE

La syntaxe de UPDATE requête pour la table Iceberg est très similaire à la UPDATE syntaxe existante pour la table RMS :

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] UPDATE iceberg_table [ [ AS ] alias ] SET column = { expression } [,...] [ FROM fromlist ] [ WHERE condition ]

Vous pouvez également utiliser la notation en trois parties pour les compartiments de tables S3 :

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] UPDATE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [ [ AS ] alias ] SET column = { expression } [,...] [ FROM fromlist ] [ WHERE condition ]

Pour le catalogue awsdatacatalog racine monté automatiquement :

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] UPDATE awsdatacatalog.<database_name>.<table_name> [ [ AS ] alias ] SET column = { expression } [,...] [ FROM fromlist ] [ WHERE condition ]

Il iceberg_table peut être référencé à l'aide du <external_schema>.<external_table_name> formulaire ou utiliser la notation en 3 parties pour le catalogue monté automatiquement. Consultez la section Référencement des tables Iceberg dans Amazon Redshift.

Vous pouvez mettre à jour une table en faisant référence aux informations d’autres tables. Répertoriez ces autres tables dans la clause FROM ou utilisez une sous-requête dans le cadre de la condition WHERE. Les tables sources peuvent être des tables Iceberg ou des tables Amazon Redshift RMS.

UPDATEpeut également fonctionner sur une table partitionnée. En cas de UPDATE modification des valeurs de colonne appartenant à la spécification de partition actuelle, la nouvelle ligne mise à jour est insérée dans la nouvelle partition en fonction de la valeur récemment mise à jour.

Par exemple, considérez une table Iceberg partitionnée comme suit :

CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date; INSERT INTO my_external_schema.lineitem VALUES (10099, '20251231', ...);

Et lorsque vous exécutez la requête de mise à jour suivante :

UPDATE my_external_schema.lineitem SET l_ship_date = '20260101' WHERE l_item_id = 10099;

la ligne avec l_item_id 10099 passe de la partition 20251231 à la nouvelle partition20260101.

Il est également important de noter qu'il est possible qu'il UPDATE comporte plusieurs valeurs candidates. Considérez la requête ci-dessous :

CREATE TABLE my_ext_schema.t1(x1 int, y1 int) USING ICEBERG LOCATION ...; CREATE TABLE my_ext_schema.t2(x2 int, y2 int) USING ICEBERG LOCATION ...; INSERT INTO my_ext_schema.t1 VALUES (1,10), (2,20), (3,30); INSERT INTO my_ext_schema.t2 VALUES (2,40), (2,50); UPDATE my_ext_schema.t1 SET y1=y2 FROM my_ext_schema.t2 WHERE x1=x2;

Dans ce cas, y1 peut être 40 ou 50. Le résultat n'est pas déterministe. Vous pouvez définir le paramètre de configuration error_on_nondeterministic_update sur true pour forcer l'erreur de requête dans ce cas. Cela est cohérent avec le UPDATE comportement existant de la table RMS. Pour en savoir plus, consultez https://docs.aws.amazon.com/redshift/latest/dg/r_error_on_nondeterministic_update.html error_on_nondeterministic_update.

MERGE

La MERGE requête fusionne conditionnellement les lignes d'une table source dans une table cible. Elle partage la même syntaxe de MERGE requête que la table RMS existante :

MERGE INTO target_iceberg_table USING source_table [ [ AS ] alias ] ON match_condition [ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) | REMOVE DUPLICATES ]

Vous pouvez également utiliser la notation en trois parties pour les compartiments de tables S3 :

MERGE INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> USING source_table [ [ AS ] alias ] ON match_condition [ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) | REMOVE DUPLICATES ]

Pour le catalogue awsdatacatalog racine monté automatiquement :

MERGE INTO awsdatacatalog.<database_name>.<table_name> USING source_table [ [ AS ] alias ] ON match_condition [ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) | REMOVE DUPLICATES ]

Il target_iceberg_table peut être référencé à l'aide du <external_schema>.<external_table_name> formulaire ou utiliser la notation en 3 parties pour le catalogue monté automatiquement. Consultez la section Référencement des tables Iceberg dans Amazon Redshift.

Il source_table peut s'agir d'une table Iceberg ou d'une table Amazon Redshift RMS.

Lorsqu'elle REMOVE DUPLICATES est utilisée, la MERGE commande utilise le mode simplifié. Pour plus de détails sur le mode simplifié, reportez-vous au document de MERGE commande d'origine.

Lors de l'exécution de la MERGE requête, Amazon Redshift génère et stocke des fichiers de données intermédiaires dans l'emplacement de la table cible. Ces fichiers seront ramassés à la fin de la requête. Pour cette raison, la MERGE requête nécessiterait une DELETE autorisation sur le compartiment Amazon S3 pour fonctionner correctement. Une erreur d'autorisation insuffisante serait générée en cas d'échec de l'opération de collecte des déchets. Pour les tables Amazon S3, la collecte des déchets est gérée par le service de tables Amazon S3. Par conséquent, aucune DELETE autorisation n'est requise pour exécuter MERGE la requête.

DROP TABLE

Pour supprimer une table Iceberg du catalogue, utilisez la DROP TABLE commande suivante :

DROP TABLE <external_schema>.<table_name>

Vous pouvez également utiliser la notation en trois parties avec les catalogues montés automatiquement :

DROP TABLE "<catalog_name>".<database_name>.<table_name>

La suppression d'une table Iceberg est une opération basée uniquement sur les métadonnées. Il supprime l'entrée de table du catalogue AWS Glue Data Catalog de tables Amazon S3, s'il s'agit d'une table Amazon S3. Amazon Redshift ne nettoie ni ne supprime aucun fichier de données ni aucun fichier de métadonnées existant sous l'emplacement de la table. Vous pouvez utiliser les fonctionnalités AWS Glue et les tableaux Amazon S3 pour supprimer les fichiers orphelins. Pour AWS Glue, voir Suppression de fichiers orphelins. Pour les tables Amazon S3, consultez la section Maintenance des tables.