

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.

# Exemples de requêtes de tables de métadonnées
<a name="metadata-tables-example-queries"></a>

Les exemples suivants montrent comment obtenir différents types d’informations à partir de vos tables de métadonnées S3 à l’aide de requêtes SQL standard.

Gardez à l’esprit les points suivants lorsque vous utilisez ces exemples :
+ Ces exemples sont conçus pour fonctionner avec Amazon Athena. Vous devrez peut-être les modifier pour qu’ils fonctionnent avec un autre moteur de requête.
+ Assurez-vous de comprendre comment [optimiser vos requêtes](metadata-tables-optimizing-query-performance.md).
+ Remplacez `b_{{general-purpose-bucket-name}}` par le nom de votre espace de noms. 
+ Pour obtenir la liste complète des colonnes prises en charge, consultez les [Schémas de tables de journal de métadonnées S3](metadata-tables-schema.md) et le [Schéma des tables d’inventaire dynamiques de S3 Metadata](metadata-tables-inventory-schema.md). 

**Contents**
+ [Exemples d’interrogation de table de journal](#metadata-tables-example-queries-journal-tables)
  + [Recherche d’objets par extension de fichier](#metadata-tables-example-query-object-pattern)
  + [Affichage de la liste des suppressions d’objets](#metadata-tables-example-query-delete-events)
  + [Répertorier les clés de AWS KMS chiffrement utilisées par vos objets](#metadata-tables-example-query-objects-using-kms-key)
  + [Affichage de la liste des objets qui n’utilisent pas de clés KMS](#metadata-tables-example-query-objects-not-using-kms-key)
  + [Liste des clés de AWS KMS chiffrement utilisées pour les `PUT` opérations au cours des 7 derniers jours](#metadata-tables-example-query-objects-using-kms-key-puts)
  + [Liste des objets supprimés au cours des dernières 24 heures par S3 Lifecycle](#metadata-tables-example-query-objects-deleted-lifecycle)
  + [Affichage de la liste des métadonnées fournies par Amazon Bedrock](#metadata-tables-example-query-bedrock)
  + [Identification de l’état actuel de vos objets](#metadata-tables-example-query-current-state)
+ [Exemples d’interrogation de table d’inventaire](#metadata-tables-example-queries-inventory-tables)
  + [Identification des jeux de données qui utilisent des balises spécifiques](#metadata-tables-example-query-datasets-specific-tags)
  + [Liste des objets non chiffrés avec SSE-KMS](#metadata-tables-example-query-objects-not-kms-encrypted)
  + [Liste des objets non chiffrés](#metadata-tables-example-query-objects-not-encrypted)
  + [Liste des objets générés par Amazon Bedrock](#metadata-tables-example-query-objects-generated-bedrock)
  + [Rapprochement de la table d’inventaire et de la table de journal](#metadata-tables-example-query-generate-latest-inventory)
  + [Recherche des versions en cours de vos objets](#metadata-tables-example-query-latest-version)
+ [Jonction de métadonnées personnalisées à des tables de métadonnées S3](metadata-tables-join-custom-metadata.md)
+ [Visualisation des données des tables de métadonnées avec Amazon Quick](metadata-tables-quicksight-dashboards.md)

## Exemples d’interrogation de table de journal
<a name="metadata-tables-example-queries-journal-tables"></a>

Vous pouvez utiliser les exemples de requête suivants pour interroger vos tables de journal.

### Recherche d’objets par extension de fichier
<a name="metadata-tables-example-query-object-pattern"></a>

La requête suivante renvoie les objets associés à une extension de fichier spécifique (`.jpg` dans ce cas) :

```
SELECT key FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."journal"
WHERE key LIKE '%.jpg'
AND record_type = 'CREATE'
```

### Affichage de la liste des suppressions d’objets
<a name="metadata-tables-example-query-delete-events"></a>

La requête suivante renvoie les événements de suppression d'objets, y compris l' Compte AWS identifiant ou le principal AWS de service à l'origine de la demande :

```
SELECT DISTINCT bucket, key, sequence_number, record_type, record_timestamp, requester, source_ip_address, version_id
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."journal"
WHERE record_type = 'DELETE';
```

### Répertorier les clés de AWS KMS chiffrement utilisées par vos objets
<a name="metadata-tables-example-query-objects-using-kms-key"></a>

La requête suivante renvoie ARNs les clés AWS Key Management Service (AWS KMS) chiffrant vos objets :

```
SELECT DISTINCT kms_key_arn
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."journal";
```

### Affichage de la liste des objets qui n’utilisent pas de clés KMS
<a name="metadata-tables-example-query-objects-not-using-kms-key"></a>

La requête suivante renvoie des objets qui ne sont pas chiffrés à l'aide de AWS KMS clés :

```
SELECT DISTINCT kms_key_arn
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."journal"
WHERE encryption_status NOT IN ('SSE-KMS', 'DSSE-KMS')
AND record_type = 'CREATE';
```

### Liste des clés de AWS KMS chiffrement utilisées pour les `PUT` opérations au cours des 7 derniers jours
<a name="metadata-tables-example-query-objects-using-kms-key-puts"></a>

La requête suivante renvoie ARNs les clés AWS Key Management Service (AWS KMS) chiffrant vos objets :

```
SELECT DISTINCT kms_key_arn 
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."journal"
WHERE record_timestamp > (current_date - interval '7' day)
AND kms_key_arn is NOT NULL;
```

### Liste des objets supprimés au cours des dernières 24 heures par S3 Lifecycle
<a name="metadata-tables-example-query-objects-deleted-lifecycle"></a>

La requête suivante renvoie la liste des objets que S3 Lifecycle a fait expirer la veille :

```
SELECT bucket, key, version_id, last_modified_date, record_timestamp, requester
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."journal"
WHERE requester = 's3.amazonaws.com'
AND record_type = 'DELETE' 
AND record_timestamp > (current_date - interval '1' day)
```

### Affichage de la liste des métadonnées fournies par Amazon Bedrock
<a name="metadata-tables-example-query-bedrock"></a>

Certains AWS services (comme [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html)) chargent des objets sur Amazon S3. Vous pouvez interroger les métadonnées des objets fournies par ces services. Par exemple, la requête suivante inclut la colonne `user_metadata` permettant de déterminer si des objets ont été chargés par Amazon Bedrock dans un compartiment à usage général :

```
SELECT DISTINCT bucket, key, sequence_number, record_type, record_timestamp, user_metadata
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."journal"
WHERE record_type = 'CREATE'
AND user_metadata['content-source'] = 'AmazonBedrock';
```

Si Amazon Bedrock a chargé un objet dans votre compartiment, la colonne `user_metadata` affiche les métadonnées suivantes associées à cet objet dans le résultat de la requête :

```
user_metadata
{content-additional-params -> requestid="CVK8FWYRW0M9JW65", signedContentSHA384="38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", content-model-id -> bedrock-model-arn, content-source -> AmazonBedrock}
```

### Identification de l’état actuel de vos objets
<a name="metadata-tables-example-query-current-state"></a>

La requête suivante peut vous aider à déterminer l’état actuel de vos objets. Cette requête identifie la version la plus récente de chaque objet, filtre les objets supprimés et marque la dernière version de chacun d’eux selon des numéros de séquence. Les résultats sont triés en fonction des colonnes `bucket`, `key` et `sequence_number`.

```
WITH records_of_interest as (
   -- Start with a query that can narrow down the records of interest.
    SELECT * from "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."journal"
),

version_stacks as (
   SELECT *,
          -- Introduce a column called 'next_sequence_number', which is the next larger
          -- sequence_number for the same key version_id in sorted order.
          LEAD(sequence_number, 1) over (partition by (bucket, key, coalesce(version_id, '')) order by sequence_number ASC) as next_sequence_number
   from records_of_interest
),

-- Pick the 'tip' of each version stack triple: (bucket, key, version_id).
-- The tip of the version stack is the row of that triple with the largest sequencer.
-- Selecting only the tip filters out any row duplicates.
-- This isn't typical, but some events can be delivered more than once to the table
-- and include rows that might no longer exist in the bucket (since the
-- table contains rows for both extant and extinct objects).
-- In the next subquery, eliminate the rows that contain deleted objects.
current_versions as (
    SELECT * from version_stacks where next_sequence_number is NULL
),

-- Eliminate the rows that are extinct from the bucket by filtering with
-- record_type. An object version has been deleted from the bucket if its tip is
-- record_type==DELETE.
existing_current_versions as (
    SELECT * from current_versions where not (record_type = 'DELETE' and is_delete_marker = FALSE)
),

-- Optionally, to determine which of several object versions is the 'latest',
-- you can compare their sequence numbers. A version_id is the latest if its
-- tip's sequencer is the largest among all other tips in the same key.
with_is_latest as (
    SELECT *,
           -- Determine if the sequence_number of this row is the same as the largest sequencer for the key that still exists.
           sequence_number = (MAX(sequence_number) over (partition by (bucket, key))) as is_latest_version
    FROM existing_current_versions
)

SELECT * from with_is_latest
ORDER BY bucket, key, sequence_number;
```

## Exemples d’interrogation de table d’inventaire
<a name="metadata-tables-example-queries-inventory-tables"></a>

Vous pouvez utiliser les exemples de requête suivants pour interroger vos tables d’inventaire.

### Identification des jeux de données qui utilisent des balises spécifiques
<a name="metadata-tables-example-query-datasets-specific-tags"></a>

La requête suivante renvoie le jeu de données qui utilise les balises spécifiées :

```
SELECT * 
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."inventory"
WHERE object_tags['key1'] = 'value1'
AND object_tags['key2'] = 'value2';
```

### Liste des objets non chiffrés avec SSE-KMS
<a name="metadata-tables-example-query-objects-not-kms-encrypted"></a>

La requête suivante renvoie les objets qui ne sont pas chiffrés avec SSE-KMS :

```
SELECT key, encryption_status 
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."inventory"
WHERE encryption_status != 'SSE-KMS';
```

### Liste des objets non chiffrés
<a name="metadata-tables-example-query-objects-not-encrypted"></a>

La requête suivante renvoie les objets qui ne sont pas chiffrés :

```
SELECT bucket, key, version_id  
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."inventory"
WHERE encryption_status IS NULL;
```

### Liste des objets générés par Amazon Bedrock
<a name="metadata-tables-example-query-objects-generated-bedrock"></a>

La requête suivante répertorie les objets générés par Amazon Bedrock :

```
SELECT DISTINCT bucket, key, sequence_number, user_metadata
FROM "s3tablescatalog/aws-s3"."b_{{general-purpose-bucket-name}}"."inventory"
WHERE user_metadata['content-source'] = 'AmazonBedrock';
```

### Rapprochement de la table d’inventaire et de la table de journal
<a name="metadata-tables-example-query-generate-latest-inventory"></a>

La requête suivante génère une inventory-table-like liste actualisée avec le contenu actuel du bucket. Plus précisément, la liste obtenue combine le dernier instantané de la table d’inventaire avec les derniers événements de la table de journal. 

Pour que cette requête produise les résultats les plus précis, les tables de journal et d’inventaire doivent avoir le statut Active.

Nous recommandons d’utiliser cette requête pour les compartiments à usage général contenant moins d’un milliard (10^9) objets.

Cet exemple de requête applique les simplifications suivantes aux résultats de la liste (par rapport à la table d’inventaire) :
+ **Omissions de colonnes** : les colonnes `bucket`, `is_multipart`, `encryption_status`, `is_bucket_key_enabled`, `kms_key_arn` et `checksum_algorithm` ne font pas partie des résultats finaux. Le fait de réduire au minimum l’ensemble de colonnes facultatives améliore les performances.
+ **Inclusion de tous les enregistrements** : la requête renvoie toutes les clés et versions des objets, y compris la version null (dans les compartiments pour lesquels la gestion des versions est inactive ou suspendue) et les marqueurs de suppression. Pour voir des exemples de filtrage des résultats visant à afficher uniquement les clés qui vous intéressent, consultez la clause `WHERE` à la fin de la requête.
+ **Rapprochement accéléré** : dans de rares cas, la requête peut signaler temporairement des objets qui ne se trouvent plus dans le compartiment. Ces écarts disparaissent dès que l’instantané suivant de la table d’inventaire est disponible. Ce comportement offre un compromis entre performance et précision.

Pour exécuter cette requête dans Amazon Athena, assurez-vous de sélectionner le catalogue `s3tablescatalog/aws-s3` et la base de données `b_{{general-purpose-bucket-name}}` pour la configuration des métadonnées du compartiment à usage général contenant vos tables de journal et d’inventaire.

```
WITH inventory_time_cte AS (
    SELECT COALESCE(inventory_time_from_property, inventory_time_default) AS inventory_time FROM
    (
      SELECT * FROM
        (VALUES (TIMESTAMP '2024-12-01 00:00')) AS T (inventory_time_default)
      LEFT OUTER JOIN
        (
         SELECT from_unixtime(CAST(value AS BIGINT) / 1000.0) AS inventory_time_from_property FROM "journal$properties"
         WHERE key = 'aws.s3metadata.oldest-uncoalesced-record-timestamp' LIMIT 1
        )
      ON TRUE
    )
),

working_set AS (
    SELECT
        key,
        sequence_number,
        version_id,
        is_delete_marker,
        size,
        COALESCE(last_modified_date, record_timestamp) AS last_modified_date,
        e_tag,
        storage_class,
        object_tags,
        user_metadata,
        (record_type = 'DELETE' AND NOT COALESCE(is_delete_marker, FALSE)) AS _is_perm_delete
    FROM journal j
    CROSS JOIN inventory_time_cte t
    WHERE j.record_timestamp > (t.inventory_time - interval '15' minute)

    UNION ALL

    SELECT
        key,
        sequence_number,
        version_id,
        is_delete_marker,
        size,
        last_modified_date,
        e_tag,
        storage_class,
        object_tags,
        user_metadata,
        FALSE AS _is_perm_delete
    FROM inventory i
),

updated_inventory AS (
    SELECT * FROM (
        SELECT *,
            MAX(sequence_number) OVER (PARTITION BY key, version_id) AS _supremum_sn
        FROM working_set
    )
    WHERE sequence_number = _supremum_sn
)

SELECT
    key,
    sequence_number,
    version_id,
    is_delete_marker,
    size,
    last_modified_date,
    e_tag,
    storage_class,
    object_tags,
    user_metadata
FROM updated_inventory
-- This filter omits only permanent deletes from the results. Delete markers will still be shown.
WHERE NOT _is_perm_delete
-- You can add additional filters here. Examples:
--    AND object_tags['department'] = 'billing'
--    AND starts_with(key, 'reports/')
ORDER BY key ASC, sequence_number DESC;
```

### Recherche des versions en cours de vos objets
<a name="metadata-tables-example-query-latest-version"></a>

La requête suivante utilise la table d’inventaire pour générer une nouvelle table de sortie qui indique les versions en cours des objets. La table de sortie est intentionnellement semblable à un rapport S3 Inventory. La table de sortie inclut un champ `is_latest` qui indique si l’objet est la version en cours. Le `is_latest` champ est équivalent au **IsLatest**champ d'un [rapport d'inventaire S3](storage-inventory.md#storage-inventory-contents). 

Cette requête fonctionne pour les compartiments à usage général dont la [gestion des versions S3](Versioning.md) est activée ou suspendue. 

**Conditions préalables**  
La requête affiche les résultats dans une nouvelle table S3 afin de prendre en charge d’autres requêtes et d’améliorer les performances par rapport à l’affichage de lignes à l’écran. Par conséquent, avant d’exécuter cette requête, assurez-vous de remplir les conditions suivantes. Si vous choisissez de ne pas afficher les résultats dans une nouvelle table, vous pouvez ignorer ces étapes. 
+ Vous devez disposer d’un compartiment de table géré par le client avec un espace de noms existant comme emplacement de sortie de la nouvelle table. Pour plus d’informations, consultez [Création d’un compartiment de tables](s3-tables-buckets-create.md) et [Création d’un espace de noms](s3-tables-namespace-create.md). 
+ Pour interroger votre nouvelle table de sortie, vous devez configurer une méthode d’accès. Pour de plus amples informations, veuillez consulter [Accès aux données des tables](s3-tables-access.md). Si vous souhaitez interroger la table de sortie avec des services AWS d'analyse tels qu'Amazon Athena, votre bucket de table géré par le client doit être intégré aux services d'analyse. AWS Pour de plus amples informations, veuillez consulter [Présentation de l'intégration d'Amazon S3 Tables aux services d' AWS analyse](s3-tables-integration-overview.md). 

Pour utiliser cette requête, remplacez `{{amzn-s3-demo-table-bucket}}` par le nom du compartiment de table géré par le client existant dans lequel vous souhaitez créer la table de sortie. Remplacez {{`existing_namespace`}} par le nom de l’espace de noms dans lequel vous souhaitez créer la table de sortie dans votre compartiment de table. Remplacez {{`new_table`}} par le nom que vous souhaitez donner à votre table de sortie. Assurez-vous que le nom de votre table de sortie respecte les [règles de dénomination des tables](s3-tables-buckets-naming.md#naming-rules-table).

Pour exécuter cette requête dans Amazon Athena, assurez-vous de sélectionner le catalogue `s3tablescatalog/aws-s3` et la base de données `b_{{general-purpose-bucket-name}}` pour la configuration des métadonnées du compartiment à usage général contenant votre table d’inventaire. 

```
-- If you don't want to output the results to a new table, remove the following two lines 
-- (everything before the WITH clause). 
CREATE TABLE "s3tablescatalog/{{amzn-s3-demo-table-bucket}}"."{{existing_namespace}}"."{{new_table}}" 
as (
WITH 
my_inventory AS (
  SELECT 
        bucket,
        key,
        version_id,
        sequence_number,
        is_delete_marker,
        size,
        last_modified_date,
        storage_class
  FROM inventory
-- For prefix filtering, use a WHERE clause with % at the end.
--     WHERE key LIKE 'prefix%'
  ),
 
inventory_with_is_latest as (
SELECT *,
       ROW_NUMBER() OVER (
         PARTITION BY key 
         ORDER BY sequence_number DESC
       ) = 1 AS is_latest
FROM my_inventory
    )

SELECT
        bucket,
        key,
        version_id,
        sequence_number,
        is_delete_marker,
        size,
        last_modified_date,
        storage_class,
        is_latest

FROM inventory_with_is_latest

-- If you want only the current version of each key, uncomment the following WHERE clause.
-- WHERE is_latest = TRUE
-- If you aren't outputting the results to a new table, remove the next line: 
);
```