> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Plus de 20 milliards d'enregistrements de données provenant de Sensor.Community, un réseau mondial de capteurs porté par des contributeurs qui produit des données environnementales ouvertes.

# Données des capteurs environnementaux

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

[Sensor.Community](https://sensor.community/en/) est un réseau mondial de capteurs porté par des contributeurs, qui produit des données environnementales ouvertes. Les données sont collectées par des capteurs partout dans le monde. N’importe qui peut acheter un capteur et l’installer où bon lui semble. Les API permettant de télécharger les données sont disponibles sur [GitHub](https://github.com/opendata-stuttgart/meta/wiki/APIs), et les données sont librement accessibles sous la licence [Database Contents License (DbCL)](https://opendatacommons.org/licenses/dbcl/1-0/).

<Warning>
  Le jeu de données contient plus de 20 milliards d’enregistrements ; soyez donc prudent avant de simplement copier-coller les commandes ci-dessous, sauf si vos ressources peuvent gérer un tel volume. Les commandes ci-dessous ont été exécutées sur une instance de **production** de [ClickHouse Cloud](https://clickhouse.cloud).
</Warning>

1. Les données se trouvent dans S3, nous pouvons donc utiliser la fonction de table `s3` pour créer une table à partir des fichiers. Nous pouvons également interroger les données directement. Examinons quelques lignes avant d’essayer de les insérer dans ClickHouse :

```sql theme={null}
SELECT *
FROM s3(
    'https://clickhouse-public-datasets.s3.eu-central-1.amazonaws.com/sensors/monthly/2019-06_bmp180.csv.zst',
    'CSVWithNames'
   )
LIMIT 10
SETTINGS format_csv_delimiter = ';';
```

Les données se trouvent dans des fichiers CSV, mais le délimiteur est un point-virgule. Les lignes se présentent ainsi :

```response theme={null}
┌─sensor_id─┬─sensor_type─┬─location─┬────lat─┬────lon─┬─timestamp───────────┬──pressure─┬─altitude─┬─pressure_sealevel─┬─temperature─┐
│      9119 │ BMP180      │     4594 │ 50.994 │  7.126 │ 2019-06-01T00:00:00 │    101471 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │        19.9 │
│     21210 │ BMP180      │    10762 │ 42.206 │ 25.326 │ 2019-06-01T00:00:00 │     99525 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │        19.3 │
│     19660 │ BMP180      │     9978 │ 52.434 │ 17.056 │ 2019-06-01T00:00:04 │    101570 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │        15.3 │
│     12126 │ BMP180      │     6126 │ 57.908 │  16.49 │ 2019-06-01T00:00:05 │ 101802.56 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │        8.07 │
│     15845 │ BMP180      │     8022 │ 52.498 │ 13.466 │ 2019-06-01T00:00:05 │    101878 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │          23 │
│     16415 │ BMP180      │     8316 │ 49.312 │  6.744 │ 2019-06-01T00:00:06 │    100176 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │        14.7 │
│      7389 │ BMP180      │     3735 │ 50.136 │ 11.062 │ 2019-06-01T00:00:06 │     98905 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │        12.1 │
│     13199 │ BMP180      │     6664 │ 52.514 │  13.44 │ 2019-06-01T00:00:07 │ 101855.54 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │       19.74 │
│     12753 │ BMP180      │     6440 │ 44.616 │  2.032 │ 2019-06-01T00:00:07 │     99475 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │          17 │
│     16956 │ BMP180      │     8594 │ 52.052 │  8.354 │ 2019-06-01T00:00:08 │    101322 │ ᴺᵁᴸᴸ     │ ᴺᵁᴸᴸ              │        17.2 │
└───────────┴─────────────┴──────────┴────────┴────────┴─────────────────────┴───────────┴──────────┴───────────────────┴─────────────┘
```

2. Nous utiliserons la table `MergeTree` suivante pour stocker les données dans ClickHouse :

```sql theme={null}
CREATE TABLE sensors
(
    sensor_id UInt16,
    sensor_type Enum('BME280', 'BMP180', 'BMP280', 'DHT22', 'DS18B20', 'HPM', 'HTU21D', 'PMS1003', 'PMS3003', 'PMS5003', 'PMS6003', 'PMS7003', 'PPD42NS', 'SDS011'),
    location UInt32,
    lat Float32,
    lon Float32,
    timestamp DateTime,
    P1 Float32,
    P2 Float32,
    P0 Float32,
    durP1 Float32,
    ratioP1 Float32,
    durP2 Float32,
    ratioP2 Float32,
    pressure Float32,
    altitude Float32,
    pressure_sealevel Float32,
    temperature Float32,
    humidity Float32,
    date Date MATERIALIZED toDate(timestamp)
)
ENGINE = MergeTree
ORDER BY (timestamp, sensor_id);
```

3. Les services ClickHouse Cloud disposent d’un cluster nommé `default`. Nous utiliserons la table function `s3Cluster`, qui lit les fichiers S3 en parallèle à partir des nœuds de votre cluster. (Si vous n'avez pas de cluster, utilisez simplement la fonction `s3` et supprimez le nom du cluster.)

Cette requête prendra un certain temps — elle représente environ 1,67 To de données non compressées :

```sql theme={null}
INSERT INTO sensors
    SELECT *
    FROM s3Cluster(
        'default',
        'https://clickhouse-public-datasets.s3.amazonaws.com/sensors/monthly/*.csv.zst',
        'CSVWithNames',
        $$ sensor_id UInt16,
        sensor_type String,
        location UInt32,
        lat Float32,
        lon Float32,
        timestamp DateTime,
        P1 Float32,
        P2 Float32,
        P0 Float32,
        durP1 Float32,
        ratioP1 Float32,
        durP2 Float32,
        ratioP2 Float32,
        pressure Float32,
        altitude Float32,
        pressure_sealevel Float32,
        temperature Float32,
        humidity Float32 $$
    )
SETTINGS
    format_csv_delimiter = ';',
    input_format_allow_errors_ratio = '0.5',
    input_format_allow_errors_num = 10000,
    input_format_parallel_parsing = 0,
    date_time_input_format = 'best_effort',
    max_insert_threads = 32,
    parallel_distributed_insert_select = 1;
```

Voici la réponse — indiquant le nombre de lignes et la vitesse de traitement. Les données sont ingérées à plus de 6 millions de lignes par seconde !

```response theme={null}
0 rows in set. Elapsed: 3419.330 sec. Processed 20.69 billion rows, 1.67 TB (6.05 million rows/s., 488.52 MB/s.)
```

4. Voyons quel espace de stockage sur disque est nécessaire pour la table `sensors` :

```sql theme={null}
SELECT
    disk_name,
    formatReadableSize(sum(data_compressed_bytes) AS size) AS compressed,
    formatReadableSize(sum(data_uncompressed_bytes) AS usize) AS uncompressed,
    round(usize / size, 2) AS compr_rate,
    sum(rows) AS rows,
    count() AS part_count
FROM system.parts
WHERE (active = 1) AND (table = 'sensors')
GROUP BY
    disk_name
ORDER BY size DESC;
```

Les 1,67 To sont compressés à 310 Gio, et il y a 20,69 milliards de lignes :

```response theme={null}
┌─disk_name─┬─compressed─┬─uncompressed─┬─compr_rate─┬────────rows─┬─part_count─┐
│ s3disk    │ 310.21 GiB │ 1.30 TiB     │       4.29 │ 20693971809 │        472 │
└───────────┴────────────┴──────────────┴────────────┴─────────────┴────────────┘
```

5. Analysons les données maintenant qu'elles sont stockées dans ClickHouse. Notez que le volume de données augmente au fil du temps, à mesure que davantage de capteurs sont mis en service :

```sql theme={null}
SELECT
    date,
    count()
FROM sensors
GROUP BY date
ORDER BY date ASC;
```

Nous pouvons créer un graphique dans la console SQL pour visualiser les résultats :

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/qvDh3oxLPI7c74wx/images/getting-started/example-datasets/sensors_01.png?fit=max&auto=format&n=qvDh3oxLPI7c74wx&q=85&s=626fe1cf179782cba64ac5775e998211" size="md" alt="Nombre d’événements par jour" width="2076" height="956" data-path="images/getting-started/example-datasets/sensors_01.png" />

6. Cette requête compte le nombre de jours très chauds et humides :

```sql theme={null}
WITH
    toYYYYMMDD(timestamp) AS day
SELECT day, count() FROM sensors
WHERE temperature >= 40 AND temperature <= 50 AND humidity >= 90
GROUP BY day
ORDER BY day ASC;
```

Voici une visualisation du résultat :

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/qvDh3oxLPI7c74wx/images/getting-started/example-datasets/sensors_02.png?fit=max&auto=format&n=qvDh3oxLPI7c74wx&q=85&s=8f924990d4566ccefb81697e808a4294" size="md" alt="Journées chaudes et humides" width="2078" height="1048" data-path="images/getting-started/example-datasets/sensors_02.png" />
