- Partie 1 : Par ou commencer ? (cet article)
- Partie 2 : Charger des donnees avec COPY INTO et Snowpipe
- Partie 3 : Transformer vos donnees avec SQL et Dynamic Tables
- Partie 4 : Securite, Roles et Bonnes Pratiques
01. Qu'est-ce que Snowflake ?
Snowflake est une plateforme de donnees cloud-native qui fonctionne sur AWS, Azure et Google Cloud. Contrairement aux data warehouses traditionnels, Snowflake separe le stockage du calcul, ce qui signifie que vous pouvez scaler l'un sans toucher a l'autre.
En tant que Data Engineer, Snowflake vous offre :
- Zero administration : pas de serveurs a gerer, pas de tuning d'index, pas de VACUUM
- Scaling automatique : augmentez/diminuez la puissance en quelques secondes
- Support multi-format : donnees structurees (CSV), semi-structurees (JSON, Parquet, Avro) et non-structurees
- Pay-per-use : vous ne payez que quand vos warehouses tournent
Snowflake offre un essai gratuit de 30 jours avec 400$ de credits. C'est largement suffisant pour suivre ce guide et experimenter. Inscrivez-vous sur signup.snowflake.com.
02. L'architecture 3 couches
Snowflake repose sur une architecture unique a 3 couches independantes. Comprendre cette architecture est fondamental pour bien utiliser la plateforme :
Couche Storage
Snowflake stocke toutes les donnees dans un format colonnaire compresse et optimise, organise en micro-partitions. Vous n'avez jamais a gerer le stockage directement : Snowflake s'occupe de la compression, du partitionnement et de l'optimisation.
Couche Compute
Les Virtual Warehouses sont des clusters de calcul independants. Chaque warehouse fonctionne de maniere isolee : un warehouse lent ne ralentit jamais un autre. Vous pouvez en creer autant que necessaire et les dimensionner selon vos besoins.
Couche Cloud Services
C'est le "cerveau" de Snowflake. Cette couche gere l'authentification, l'optimisation des requetes, la gestion des metadonnees et le controle d'acces. Elle est toujours active et ne genere presque aucun cout.
03. Creer votre premier environnement
Une fois connecte a Snowflake via Snowsight (l'interface web), la premiere etape est de creer votre espace de travail. Voici la hierarchie a comprendre :
Account → Database → Schema → Tables / Views / Stages
-- ═══ Creer un warehouse de travail ═══
CREATE WAREHOUSE IF NOT EXISTS DEV_WH
WITH
WAREHOUSE_SIZE = 'X-SMALL' -- Le plus petit (1 credit/heure)
AUTO_SUSPEND = 60 -- Suspend apres 60 secondes d'inactivite
AUTO_RESUME = TRUE -- Redemarre automatiquement
INITIALLY_SUSPENDED = TRUE; -- Ne demarre pas tout de suite
-- ═══ Creer la database ═══
CREATE DATABASE IF NOT EXISTS LEARNING_DB
COMMENT = 'Database pour apprendre Snowflake';
-- ═══ Utiliser la database ═══
USE DATABASE LEARNING_DB;
-- ═══ Creer des schemas (couches de donnees) ═══
CREATE SCHEMA IF NOT EXISTS RAW
COMMENT = 'Donnees brutes - zone de landing';
CREATE SCHEMA IF NOT EXISTS STAGING
COMMENT = 'Donnees nettoyees et transformees';
CREATE SCHEMA IF NOT EXISTS ANALYTICS
COMMENT = 'Donnees metier prets pour le reporting';
Le warehouse X-SMALL consomme 1 credit par heure. Avec AUTO_SUSPEND = 60, il s'eteint apres 1 minute d'inactivite. Vous ne payez que quand il execute des requetes.
04. Databases, Schemas et Tables
La hierarchie d'objets dans Snowflake est simple mais importante a maitriser :
| Objet | Role | Analogie |
|---|---|---|
| Database | Conteneur principal pour organiser vos donnees | Un classeur |
| Schema | Sous-dossier a l'interieur d'une database | Un onglet du classeur |
| Table | Structure qui contient les donnees en lignes/colonnes | Une feuille de calcul |
| View | Requete sauvegardee (pas de stockage) | Un raccourci vers une feuille |
-- Utiliser le bon contexte
USE LEARNING_DB.RAW;
USE WAREHOUSE DEV_WH;
-- ═══ Table des clients ═══
CREATE TABLE IF NOT EXISTS customers (
customer_id INT NOT NULL,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
email VARCHAR(255),
city VARCHAR(100),
country VARCHAR(50) DEFAULT 'France',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP()
);
-- ═══ Table des commandes ═══
CREATE TABLE IF NOT EXISTS orders (
order_id INT NOT NULL,
customer_id INT NOT NULL,
product_name VARCHAR(200),
quantity INT,
unit_price DECIMAL(10,2),
order_date DATE,
status VARCHAR(20) DEFAULT 'pending'
);
-- Verifier les tables creees
SHOW TABLES IN SCHEMA LEARNING_DB.RAW;
05. Virtual Warehouses : la puissance de calcul
Les Virtual Warehouses sont le moteur de Snowflake. Chaque warehouse est un cluster de calcul independant que vous pouvez dimensionner selon vos besoins :
| Taille | Credits/heure | Cas d'usage |
|---|---|---|
X-SMALL |
1 | Dev, tests, petites requetes |
SMALL |
2 | Requetes moyennes, BI legere |
MEDIUM |
4 | ETL courant, dashboards |
LARGE |
8 | Grosses transformations |
X-LARGE + |
16+ | Chargements massifs, ML |
-- Creer un warehouse dedie a l'ETL
CREATE WAREHOUSE IF NOT EXISTS ETL_WH
WITH
WAREHOUSE_SIZE = 'MEDIUM'
AUTO_SUSPEND = 120
AUTO_RESUME = TRUE
COMMENT = 'Warehouse dedie aux pipelines ETL';
-- Redimensionner a la volee (pas de downtime !)
ALTER WAREHOUSE ETL_WH SET WAREHOUSE_SIZE = 'LARGE';
-- Suspendre manuellement pour economiser
ALTER WAREHOUSE ETL_WH SUSPEND;
-- Voir tous vos warehouses
SHOW WAREHOUSES;
Creez des warehouses separes par usage : un pour le dev (X-SMALL), un pour l'ETL (MEDIUM), un pour le reporting (SMALL). Cela permet d'isoler les performances et de controler les couts par equipe.
06. Les Stages : la zone de transit
Un Stage est un emplacement de stockage intermediaire ou vous deposez vos fichiers avant de les charger dans une table. C'est le point d'entree de vos donnees dans Snowflake.
Il existe deux types de stages :
- Internal Stage : stockage gere par Snowflake (ideal pour debuter)
- External Stage : pointe vers S3, Azure Blob, ou GCS (pour la production)
USE LEARNING_DB.RAW;
-- ═══ Creer un file format pour les CSV ═══
CREATE FILE FORMAT IF NOT EXISTS csv_format
TYPE = 'CSV'
FIELD_DELIMITER = ','
SKIP_HEADER = 1
NULL_IF = ('', 'NULL', 'null')
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
TRIM_SPACE = TRUE;
-- ═══ Creer un file format pour JSON ═══
CREATE FILE FORMAT IF NOT EXISTS json_format
TYPE = 'JSON'
STRIP_OUTER_ARRAY = TRUE;
-- ═══ Creer un internal stage ═══
CREATE STAGE IF NOT EXISTS raw_data_stage
FILE_FORMAT = csv_format
COMMENT = 'Stage pour les fichiers bruts CSV';
-- ═══ External stage (exemple avec AWS S3) ═══
-- CREATE STAGE IF NOT EXISTS s3_stage
-- URL = 's3://mon-bucket/data/'
-- CREDENTIALS = (AWS_KEY_ID='...' AWS_SECRET_KEY='...')
-- FILE_FORMAT = csv_format;
-- Lister les fichiers dans un stage
LIST @raw_data_stage;
07. Charger des donnees avec COPY INTO
La commande COPY INTO est la methode principale pour charger des donnees dans Snowflake. C'est l'equivalent du INSERT mais optimise pour le chargement en masse de fichiers.
-- ═══ Etape 1 : Uploader un fichier vers le stage ═══
-- Via Snowsight : cliquez sur le stage > Upload
-- Ou via SnowSQL CLI :
-- PUT file:///chemin/vers/customers.csv @raw_data_stage;
-- ═══ Etape 2 : Charger dans la table ═══
COPY INTO customers
FROM @raw_data_stage/customers.csv
FILE_FORMAT = csv_format
ON_ERROR = 'CONTINUE' -- Continue malgre les erreurs
PURGE = TRUE; -- Supprime le fichier apres chargement
-- ═══ Verifier le chargement ═══
SELECT COUNT(*) AS total_rows FROM customers;
-- ═══ Voir l'historique des chargements ═══
SELECT *
FROM TABLE(INFORMATION_SCHEMA.LOAD_HISTORY(
TABLE_NAME => 'CUSTOMERS'
))
ORDER BY LAST_LOAD_TIME DESC
LIMIT 5;
CONTINUE ignore les lignes en erreur et charge le reste. ABORT_STATEMENT stoppe tout si une seule ligne echoue (plus strict, recommande en production). Utilisez VALIDATION_MODE pour tester avant de charger.
Charger du JSON (semi-structure)
-- Table avec une colonne VARIANT pour le JSON
CREATE TABLE IF NOT EXISTS raw_events (
event_data VARIANT,
loaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP()
);
-- Charger le JSON
COPY INTO raw_events (event_data)
FROM @raw_data_stage/events.json
FILE_FORMAT = json_format;
-- Interroger les donnees semi-structurees
SELECT
event_data:user_id::INT AS user_id,
event_data:event_type::STRING AS event_type,
event_data:timestamp::TIMESTAMP AS event_time
FROM raw_events
LIMIT 10;
08. Premieres requetes SQL
Snowflake utilise du SQL standard ANSI enrichi de fonctions proprietaires. Si vous connaissez SQL, vous etes deja operationnel. Voici les requetes essentielles :
-- ═══ Inserer des donnees de test ═══
INSERT INTO customers (customer_id, first_name, last_name, email, city)
VALUES
(1, 'Marie', 'Dupont', 'marie@email.com', 'Paris'),
(2, 'Ousmane','Diallo', 'ousmane@email.com', 'Dakar'),
(3, 'Sophie', 'Martin', 'sophie@email.com', 'Nantes'),
(4, 'Amadou', 'Ba', 'amadou@email.com', 'Paris');
INSERT INTO orders (order_id, customer_id, product_name, quantity, unit_price, order_date, status)
VALUES
(101, 1, 'Laptop Pro', 1, 1299.99, '2026-02-10', 'completed'),
(102, 2, 'Ecran 27"', 2, 349.00, '2026-02-15', 'completed'),
(103, 1, 'Clavier meca', 1, 159.00, '2026-02-20', 'pending'),
(104, 3, 'Souris ergo', 1, 89.99, '2026-02-22', 'completed'),
(105, 4, 'Laptop Pro', 1, 1299.99, '2026-02-25', 'pending');
-- ═══ Jointure : commandes par client ═══
SELECT
c.first_name || ' ' || c.last_name AS client,
c.city,
COUNT(o.order_id) AS nb_commandes,
SUM(o.quantity * o.unit_price) AS chiffre_affaires
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.first_name, c.last_name, c.city
ORDER BY chiffre_affaires DESC;
-- ═══ Window function : classement par CA ═══
SELECT
c.first_name || ' ' || c.last_name AS client,
SUM(o.quantity * o.unit_price) AS ca,
RANK() OVER (ORDER BY SUM(o.quantity * o.unit_price) DESC) AS rang
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.first_name, c.last_name;
09. Bonnes pratiques de nommage
Un nommage coherent est essentiel des le debut. Voici les conventions que j'utilise sur mes projets Snowflake :
| Objet | Convention | Exemple |
|---|---|---|
| Database | PROJET_ENV |
ECOMMERCE_PROD |
| Schema | COUCHE (Medallion) |
RAW, STAGING, ANALYTICS |
| Table | prefixe_nom |
dim_customers, fact_orders |
| Warehouse | USAGE_WH |
ETL_WH, BI_WH, DEV_WH |
| Stage | source_stage |
s3_raw_stage, azure_stage |
| Role | EQUIPE_NIVEAU |
DATA_ENGINEER, ANALYST_READ |
Snowflake convertit tout en MAJUSCULES par defaut. Si vous voulez preserver la casse, entourez les noms avec des guillemets doubles ("mon_Table"), mais evitez cette pratique : restez en UPPER_CASE pour la coherence.
10. Prochaines etapes
Vous avez maintenant les bases pour demarrer avec Snowflake. Voici la feuille de route pour la suite :
| Semaine | Objectif | Sujets cles |
|---|---|---|
| Semaine 1-2 | Maitriser les bases | SQL, Databases, Tables, Warehouses |
| Semaine 3-4 | Charger des donnees | Stages, COPY INTO, Snowpipe, File Formats |
| Semaine 5-6 | Transformer | SQL avance, Dynamic Tables, Streams, Tasks |
| Semaine 7-8 | Securiser et optimiser | Roles, RBAC, Cost Management, Monitoring |
Dans le prochain article de cette serie, nous plongerons dans le chargement de donnees en profondeur : COPY INTO avance, Snowpipe pour l'ingestion en continu, et les patterns de chargement incrementaux.
Si vous avez des questions ou souhaitez echanger, retrouvez-moi sur LinkedIn.
Creer un warehouse, une database et des schemas • Creer des tables • Configurer des stages et file formats • Charger des donnees avec COPY INTO • Ecrire des requetes SQL avec JOIN et Window Functions • Interroger du JSON avec VARIANT.