> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Comment interroger des données dans un bucket S3

> Apprenez à interroger des données dans un bucket S3 avec chDB.

Une grande partie des données dans le monde est stockée dans des buckets Amazon S3.
Dans ce guide, nous verrons comment interroger ces données avec chDB.

<div id="setup">
  ## Préparation
</div>

Commençons par créer un environnement virtuel :

```bash theme={null}
python -m venv .venv
source .venv/bin/activate
```

Et maintenant, nous allons installer chDB.
Assurez-vous d’avoir la version 2.0.2 ou supérieure :

```bash theme={null}
pip install "chdb>=2.0.2"
```

Nous allons maintenant installer IPython :

```bash theme={null}
pip install ipython
```

Nous allons utiliser `ipython` pour exécuter les commandes dans la suite de ce guide, que vous pouvez démarrer en lançant :

```bash theme={null}
ipython
```

Vous pouvez également utiliser le code dans un script Python ou dans votre notebook préféré.

<div id="listing-files-in-an-s3-bucket">
  ## Lister les fichiers dans un bucket S3
</div>

Commençons par lister tous les fichiers dans [un bucket S3 contenant des avis Amazon](/docs/fr/get-started/sample-datasets/amazon-reviews).
Pour ce faire, nous pouvons utiliser la [fonction de table `s3`](/docs/fr/reference/functions/table-functions/s3) et lui passer le path d’un fichier ou un joker correspondant à un ensemble de fichiers.

<Tip>
  Si vous passez uniquement le nom du bucket, une exception sera levée.
</Tip>

Nous allons également utiliser le format d’entrée [`One`](/docs/fr/reference/formats/One) pour que le fichier ne soit pas analysé ; à la place, une seule ligne est renvoyée par fichier, et nous pouvons accéder au fichier via la colonne virtuelle `_file` et au path via la colonne virtuelle `_path`.

```python theme={null}
import chdb

chdb.query("""
SELECT
    _file,
    _path
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', One)
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')
```

```text theme={null}
┌─_file───────────────────────────────┬─_path─────────────────────────────────────────────────────────────────────┐
│ amazon_reviews_2010.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2010.snappy.parquet  │
│ amazon_reviews_1990s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_1990s.snappy.parquet │
│ amazon_reviews_2013.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2013.snappy.parquet  │
│ amazon_reviews_2015.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2015.snappy.parquet  │
│ amazon_reviews_2014.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2014.snappy.parquet  │
│ amazon_reviews_2012.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2012.snappy.parquet  │
│ amazon_reviews_2000s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2000s.snappy.parquet │
│ amazon_reviews_2011.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2011.snappy.parquet  │
└─────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────┘
```

Ce bucket ne contient que des fichiers Parquet.

<div id="querying-files-in-an-s3-bucket">
  ## Interroger des fichiers dans un bucket S3
</div>

Voyons maintenant comment interroger ces fichiers.
Si nous voulons compter le nombre de lignes dans chacun de ces fichiers, nous pouvons exécuter la requête suivante :

```python theme={null}
chdb.query("""
SELECT
    _file,
    count() AS count,
    formatReadableQuantity(count) AS readableCount    
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet')
GROUP BY ALL
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')
```

```text theme={null}
┌─_file───────────────────────────────┬────count─┬─readableCount───┐
│ amazon_reviews_2013.snappy.parquet  │ 28034255 │ 28.03 million   │
│ amazon_reviews_1990s.snappy.parquet │   639532 │ 639.53 thousand │
│ amazon_reviews_2011.snappy.parquet  │  6112495 │ 6.11 million    │
│ amazon_reviews_2015.snappy.parquet  │ 41905631 │ 41.91 million   │
│ amazon_reviews_2012.snappy.parquet  │ 11541011 │ 11.54 million   │
│ amazon_reviews_2000s.snappy.parquet │ 14728295 │ 14.73 million   │
│ amazon_reviews_2014.snappy.parquet  │ 44127569 │ 44.13 million   │
│ amazon_reviews_2010.snappy.parquet  │  3868472 │ 3.87 million    │
└─────────────────────────────────────┴──────────┴─────────────────┘
```

Nous pouvons également indiquer l’URI HTTP d’un bucket S3 et obtenir les mêmes résultats :

```python theme={null}
chdb.query("""
SELECT
    _file,
    count() AS count,
    formatReadableQuantity(count) AS readableCount    
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/*.parquet')
GROUP BY ALL
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')
```

Voyons le schéma de ces fichiers Parquet à l’aide de la clause `DESCRIBE` :

```python theme={null}
chdb.query("""
DESCRIBE s3('s3://datasets-documentation/amazon_reviews/*.parquet')
SETTINGS describe_compact_output=1
""", 'PrettyCompact')
```

```text theme={null}
    ┌─name──────────────┬─type─────────────┐
 1. │ review_date       │ Nullable(UInt16) │
 2. │ marketplace       │ Nullable(String) │
 3. │ customer_id       │ Nullable(UInt64) │
 4. │ review_id         │ Nullable(String) │
 5. │ product_id        │ Nullable(String) │
 6. │ product_parent    │ Nullable(UInt64) │
 7. │ product_title     │ Nullable(String) │
 8. │ product_category  │ Nullable(String) │
 9. │ star_rating       │ Nullable(UInt8)  │
10. │ helpful_votes     │ Nullable(UInt32) │
11. │ total_votes       │ Nullable(UInt32) │
12. │ vine              │ Nullable(Bool)   │
13. │ verified_purchase │ Nullable(Bool)   │
14. │ review_headline   │ Nullable(String) │
15. │ review_body       │ Nullable(String) │
    └───────────────────┴──────────────────┘
```

Calculons maintenant les principales catégories de produits en fonction du nombre d’avis, ainsi que la note moyenne en étoiles :

```python theme={null}
chdb.query("""
SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet')
GROUP BY ALL
LIMIT 10
""", 'PrettyCompact')
```

```text theme={null}
    ┌─product_category─┬──reviews─┬──avg─┐
 1. │ Toys             │  4864056 │ 4.21 │
 2. │ Apparel          │  5906085 │ 4.11 │
 3. │ Luggage          │   348644 │ 4.22 │
 4. │ Kitchen          │  4880297 │ 4.21 │
 5. │ Books            │ 19530930 │ 4.34 │
 6. │ Outdoors         │  2302327 │ 4.24 │
 7. │ Video            │   380596 │ 4.19 │
 8. │ Grocery          │  2402365 │ 4.31 │
 9. │ Shoes            │  4366757 │ 4.24 │
10. │ Jewelry          │  1767667 │ 4.14 │
    └──────────────────┴──────────┴──────┘
```

<div id="querying-files-in-a-private-s3-bucket">
  ## Interroger des fichiers dans un bucket S3 privé
</div>

Si nous voulons interroger des fichiers dans un bucket S3 privé, nous devons fournir une clé d'accès et une clé secrète.
Nous pouvons transmettre ces identifiants à la fonction de table `s3` :

```python theme={null}
chdb.query("""
SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', 'access-key', 'secret')
GROUP BY ALL
LIMIT 10
""", 'PrettyCompact')
```

<Note>
  Cette requête ne fonctionnera pas, car le bucket est public !
</Note>

Une autre possibilité consiste à utiliser des [collections nommées](/docs/fr/concepts/features/configuration/server-config/named-collections), mais cette approche n’est pas encore prise en charge par chDB.
