Skip to content

Commit ff15606

Browse files
committed
ajout de titres au blocs de code
1 parent d04d504 commit ff15606

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

content/articles/2025/2025-05-27_taradata_extract_load_mapillary.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ Plusieurs options sont également disponibles pour créer un _DAG_ mais avec _Ta
7272

7373
Ci-dessous, un exemple de _DAG_ pour récupérer chaque heure la hauteur d'eau du Gardon à Anduze grâce à l'[API Hydrométrie de Hubeau](https://hubeau.eaufrance.fr/page/api-hydrometrie).
7474

75-
```py
75+
```py title="_DAG_ d'extraction/chargement de données depuis Hubeau"
7676
import requests
7777
from airflow.decorators import dag, task
7878
from datetime import datetime
@@ -149,7 +149,7 @@ Après cette entrée en matière sur Apache Airflow, voyons maintenant le script
149149

150150
La première tâche de notre _DAG_ consiste en la création du schéma d'accueil dans l'entrepôt PostgreSQL.
151151

152-
```py
152+
```py title="Tâche de création du schéma PostgreSQL"
153153
create_schema_task = postgresql_tasks.create_schema(taradata_storage, target_schema)
154154
```
155155

@@ -173,7 +173,7 @@ def create_schema(pg_storage: BasePostgreSQLDataStorage, schema: str):
173173

174174
Avec cette seconde tâche, nous créons la table d'accueil des données que nous nous apprêtons à extraire.
175175

176-
```py
176+
```py title="Tâche de création de la table temporaire de chargement"
177177
create_table_task = postgresql_tasks.execute_sql_statement.override(task_id = "créer_table_temporaire")(
178178
taradata_storage,
179179
"""
@@ -199,7 +199,7 @@ La transformation de ces données JSON en quelque chose d'exploitable, avec [QGI
199199

200200
Avant de poursuivre, nous devons chaîner les tâches. En effet, il ne faut pas essayer de créer la table avant d'avoir terminé la création du schéma. Ceci est fait grâce à l'opérateur `>>`.
201201

202-
```py
202+
```py title="Chaînage des tâches"
203203
create_schema_task >> create_table_task
204204
```
205205

@@ -253,7 +253,7 @@ repartition_aleatoire as (
253253

254254
Ne reste plus qu'à insérer cette répartition aléatoire dans notre table de chargement, ce qui donne la requête globale suivante.
255255

256-
```sql
256+
```sql title="Requête de calcul de l'emprise d'extraction et de répartition du travail"
257257
with emprise as (
258258
select ST_Collect(geom) as geom
259259
from troncons_wgs84
@@ -287,7 +287,7 @@ Nous pouvons alors afficher le résultat de cette répartition dans QGIS. De l'a
287287

288288
Tout est prêt pour extraire et charger les données. Histoire de ne pas rentrer directement dans le dur, analysons d'abord l'entête et le pseudo-code de la tâche.
289289

290-
```py
290+
```py title="Entête et pseudo-code de la tâche d'extraction/chargement"
291291
@task(task_id = "extraire_charger_features", retries = 3)
292292
def extract_load_features(extract_load_task_id: int):
293293
"""
@@ -323,7 +323,7 @@ De nouvelles cellules sont donc potentiellement créées à la sortie de la bouc
323323

324324
Cette étape consiste simplement à exécuter la requête suivante.
325325

326-
```sql
326+
```sql title="Requête de récupération de la liste des cellules à extraire/charger"
327327
select
328328
geom,
329329
ST_XMin(geom) as x_min,
@@ -348,7 +348,7 @@ Sur chaque cellule, l'extraction se fait via un appel HTTP à l'API en passant e
348348

349349
Nous avons encapsulé cet appel dans la fonction ci-dessous.
350350

351-
```py
351+
```py title="Fonction d'appel à l'API Mapillary"
352352
def call_map_features_api(cell: dict):
353353
"""
354354
Appel à l'API d'extraction des "features" au format JSON pour une cellule donnée.
@@ -373,7 +373,7 @@ Par ailleurs, Apache Airflow propose [la gestion de connexions](https://airflow.
373373

374374
Le chargement des données consiste en la mise à jour du champs `ìnformations` (type `jsonb`) de la table de chargement pour la géometrie correspondante.
375375

376-
```sql
376+
```sql title="Requête de chargement des données"
377377
update tmp_features
378378
set informations = %(informations)s
379379
where ST_Equals(geom, (%(geom)s)::geometry);
@@ -385,7 +385,7 @@ Les cellules pour lesquelles 2000 _features_ ont été retournées sont supprim
385385

386386
La suppression et l'ajout sont réalisés en un seul ordre SQL grâce au mot-clé [`returning`](https://www.postgresql.org/docs/current/dml-returning.html) qui permet de récupérer tout ou partie des champs des lignes modifiées.
387387

388-
```sql
388+
```sql title="Requête de découpage des cellules contenant plus de 2000 _features_"
389389
with cellules_a_diviser as (
390390
delete
391391
from tmp_features
@@ -410,7 +410,7 @@ La tâche 4 est construite de sorte à traiter une sous-partie des quelques 4000
410410

411411
Il faut donc invoquer autant de fois que souhaité la tâche pour chacune des sous-parties. Pour cela, nous mettons ces invocations dans une liste Python.
412412

413-
```py
413+
```py title="Création de N tâches d'extraction/chargement"
414414
extract_load_features_tasks = []
415415
for extract_load_task_id in range(1, extract_load_tasks_count + 1):
416416
extract_load_features_tasks.append(extract_load_features.override(task_id = f"extraire_charger_features_{extract_load_task_id}")(extract_load_task_id))
@@ -428,7 +428,7 @@ compute_cells_task >> extract_load_features_tasks
428428

429429
Après chargement, la table définitive de stockage des données est écrasée avec la table de chargement. Seul le champ `informations` est conservé, les autres champs n'étant utiles que pour la phase d'EL.
430430

431-
```py
431+
```py title="Tâche de remplacement de la table destination par la table temporaire de chargement"
432432
replace_table_task = postgresql_tasks.execute_sql_statement.override(task_id = "remplacer_table")(
433433
taradata_storage,
434434
"""
@@ -450,7 +450,7 @@ Le passage par la table temporaire `tmp_features` couplé à l'utilisation de la
450450

451451
L'ensemble des tâches est encapsulé dans un _DAG_ planifié de façon mensuelle.
452452

453-
```py
453+
```py title="Entête du _DAG_ d'extraction/chargement des _features_ Mapillary"
454454
@dag(dag_id = "extraction_et_chargement__mensuel__mapillary_com",
455455
start_date = datetime(1993, 1, 10),
456456
schedule_interval = schedule.get_dag_cron(tags.extract_and_load, tags.monthly),

0 commit comments

Comments
 (0)