03 Charger les données — deux méthodes
Les mêmes 26,5 millions de ticks chargés deux fois : d'abord avec ClickPipes, le pipeline géré que vous utiliseriez en production, puis avec un simple appel à s3() — et quand choisir chaque méthode.
Les données se trouvent dans un bucket S3 public : aucune clé ni aucun identifiant n'est nécessaire, il suffit d'indiquer l'URL. Le transfert s'effectue côté serveur, de S3 vers ClickHouse ; 26,5 millions de lignes ne transitent donc ni par votre ordinateur ni par le Wi-Fi du lieu.
Vous allez charger les mêmes 26,5 millions de ticks de deux façons différentes afin de les
comparer. La méthode 1 utilise ClickPipes, le pipeline géré et guidé par l'interface que vous
emploieriez en production. La méthode 2 tient en une seule ligne de SQL : le moyen le plus rapide
de charger des données pendant une démonstration. Suivez cet ordre ; un TRUNCATE entre les deux
préserve le bon nombre de lignes.
Méthode 1 — ClickPipes, la méthode gérée pour la production
ClickPipes est un service d'ingestion entièrement géré : pointez-le vers un stockage objet ou un stream, et il poursuit le chargement sans connecteur à développer. Voici le parcours complet.
- Dans le menu de gauche, cliquez sur Data sources, puis sur Create ClickPipe.

La page Data sources contient également « Upload file » et « Add sample data ».
- Sous Select the data source, choisissez Amazon S3 (en tête de la liste Popular).

- Dans Setup your ClickPipe connection, saisissez n'importe quel name, définissez Authentication method → Public (le bucket est public), puis collez ce qui suit dans S3 file path :
https://partner-workshop.s3.ap-southeast-1.amazonaws.com/fx/ticks.parquetLaissez Continuous ingestion désactivé — il s'agit d'un fichier unique — puis cliquez sur Incoming data →.

- Dans Incoming data, ClickHouse affiche un aperçu du fichier correspondant : vous verrez
fx/ticks.parquetavec 158,43 Mo. Confirmez File type → Parquet, conservez la compression Detect automatically, puis cliquez sur Parse information →.

- Dans Parse information, ClickHouse affiche une ligne d'exemple et détecte les colonnes. Sous
Upload data to, choisissez Existing table, sélectionnez la Database contenant votre
table (généralement
default) et définissez Table →forex. Vérifiez que les champs source (datetime,bid,ask,base,quote) correspondent aux colonnes de même nom — le mappage doit être automatique. Ne mappez pas les champs supplémentaires_path/_file/_size. Cliquez ensuite sur Details and settings →.

La capture affiche la base techthai du présentateur ; utilisez celle qui contient votre table.
- Dans Details and settings, conservez les Permissions par défaut (ClickPipes crée pour vous un utilisateur dédié à l'écriture), puis cliquez sur Create ClickPipe.

Aucun job Spark, aucun chargeur personnalisé.
- Vous revenez à Data sources, où apparaît votre ClickPipe. En quelques secondes, son Status passe à Completed et Records indique 26 488 218 : tous les ticks ont été chargés depuis le stockage objet.

Contrôlez le chargement. Exécutez ceci dans SQL Console :
-- expect 26,488,218 ticks across 12 pairs
SELECT count() AS ticks, uniqExact(concat(base,'/',quote)) AS pairs FROM forex;Résultat attendu
ticks = 26 488 218 et pairs = 12. Environ 26,5 millions de lignes ont été chargées depuis le stockage objet en quelques secondes.
Méthode 2 — une ligne avec s3(), la plus rapide en démonstration
Chargez maintenant exactement les mêmes données avec une seule instruction SQL, directement depuis le fichier public. Commencez par vider la table pour éviter de doubler le nombre de lignes, puis insérez :
-- clear the rows ClickPipes just loaded so we don't double up
TRUNCATE TABLE forex;
-- load all ~26.5M ticks from the public S3 file in one line (server-side)
INSERT INTO forex
SELECT * FROM s3('https://partner-workshop.s3.ap-southeast-1.amazonaws.com/fx/ticks.parquet', NOSIGN, 'Parquet');
-- and check again (expect 26,488,218)
SELECT count() AS ticks, uniqExact(concat(base,'/',quote)) AS pairs FROM forex;NOSIGN signifie « sans identifiants » : c'est tout ce qu'il faut pour lire un bucket public.
SELECT * fonctionne parce que l'ordre des colonnes de la table correspond à celui du fichier.
ClickPipes ou la fonction s3() — quand utiliser chaque solution
Les mêmes 26 488 218 lignes ont été chargées de deux façons. La différence réside dans ce qui se passe après le premier chargement : souhaitez-vous un pipeline continu et géré, ou une lecture rapide et ponctuelle ?
| ClickPipes | Fonction de table s3() | |
|---|---|---|
| Ce que c'est | Un service d'ingestion entièrement géré, configuré dans la console | Une fonction SQL appelée directement dans une requête |
| Idéal pour | Les chargements continus de production que vous voulez configurer et laisser fonctionner | Les chargements ponctuels rapides, l'exploration ad hoc et les scripts |
| Nouveaux fichiers / continuité | Peut continuer à surveiller un bucket ou un stream et charger les nouvelles données | Exécution unique : ne lit que ce qui existe à chaque lancement |
| Configuration | Interface guidée, aucun SQL nécessaire | Une seule instruction INSERT … SELECT |
| Suivi et nouvelles tentatives | Intégrés : statut, gestion des erreurs et nouvelles tentatives dans la console | Aucun : vous devez la relancer en cas d'échec |
| Sources | Nombreuses : S3, GCS, Azure, Kafka et autres streams, CDC Postgres/MySQL, etc. | Stockage objet uniquement (fonctions apparentées : gcs(), azureBlobStorage(), url()) |
Règle pratique : choisissez ClickPipes lorsque les données continuent d'arriver et que vous
souhaitez une solution gérée ; choisissez s3() pour récupérer immédiatement un fichier. Vous
avez utilisé aujourd'hui la ligne unique afin d'interroger rapidement les données — passons aux
requêtes.
02 Créer la table
Un CREATE TABLE pour 26,5 millions de ticks de change, et pourquoi base et quote ouvrent la clé de tri — une décision dont vous constaterez l'effet au module 04.
04 Exécuter les requêtes de marché
Sept requêtes sur 26,5 millions de ticks, chacune remplaçant une page de SQL : comptages approximatifs, topK, chandeliers OHLC, percentiles, combinateurs -If, argMax et défi final de la clé de tri.