ClickHouse vs Snowflake: A Practical Mini-Project for Data Students
Hands-on weekend mini-project: load NYC taxi data into ClickHouse and Snowflake, run OLAP queries, benchmark latency/cost, and build resume-ready visuals.
Beat the interview: a hands-on ClickHouse vs Snowflake mini-project for data students
Are you juggling dozens of courses and trying to build a resume-ready data project that actually impresses employers? You’re not alone. Students and early-career data engineers often struggle to pick the right stack, demonstrate performance tradeoffs, and write interview-ready talking points. This tutorial gives you a complete, practical mini-project you can finish in a weekend: import a real dataset into both ClickHouse and Snowflake, write OLAP queries, visualize results, and benchmark cost, latency, and scale — all with copy-paste commands and career-ready deliverables.
Why this project matters in 2026
In late 2025 and early 2026 the data platform landscape accelerated: ClickHouse raised a major funding round (January 2026 reporting shows a $400M round led by Dragoneer valuing ClickHouse at about $15B), and Snowflake continued expanding its AI and analytics features. That means both systems are investment-grade choices for OLAP workloads — but they have different operational models and cost characteristics.
What you'll get from this tutorial (fast):
- Clear setup steps for importing a mid-size CSV dataset into ClickHouse and Snowflake.
- Three practical OLAP queries (aggregations, window functions, time bucketing) implemented on both systems.
- A Python notebook visualization and instructions to connect Superset/Metabase for dashboards.
- Benchmark instructions measuring latency, concurrency, and cost — plus how to present the results on your resume and in interviews.
Project dataset and scope
Pick a dataset that is big enough to show meaningful performance differences but small enough to work on free tiers. For this tutorial we use a 1M-row sample of the NYC Yellow Taxi trips CSV (trip-level data with pickup/dropoff timestamps, fare, passenger count, vendor, and pickup/dropoff location IDs). You can download a 1M-row sample from a public S3 mirror or generate one by sampling the larger public dump.
Why this dataset?
- Time-series and categorical dimensions ideal for OLAP aggregations.
- Real-world business metrics: trips per hour, revenue by zone, peak latency windows.
- Easy to expand later (add a second file to simulate scale).
Environment options (quick)
Pick one of these paths depending on your budget and access:
- Free trial / student accounts: Sign up for Snowflake free trial (always watch credits), and ClickHouse Cloud trial (or use a local Docker image for ClickHouse server).
- Local dev: ClickHouse in Docker is trivial; Snowflake requires a cloud account so use the free tier if possible.
- All-in-Python: Use Python notebooks + connectors to run queries and visualize results without a GUI dashboard.
Step 1 — Prepare the data
Download the CSV and inspect columns. We'll assume a CSV with these columns: VendorID, tpep_pickup_datetime, tpep_dropoff_datetime, passenger_count, trip_distance, PULocationID, DOLocationID, fare_amount, tip_amount.
# Sample commands (Linux / macOS)
wget https://public-datasets.example/nyc_taxi_1m.csv -O nyc_taxi_1m.csv
head -n 5 nyc_taxi_1m.csv
Step 2 — Load into ClickHouse
You can run ClickHouse locally via Docker:
docker run -d --name clickhouse-server -p 9000:9000 -p 8123:8123 yandex/clickhouse-server:latest
Create a table optimized for OLAP. ClickHouse uses columnar storage and supports MergeTree engines which provide fast range queries and aggregations:
CREATE TABLE nyc_taxi (
VendorID UInt8,
tpep_pickup_datetime DateTime,
tpep_dropoff_datetime DateTime,
passenger_count UInt8,
trip_distance Float32,
PULocationID UInt32,
DOLocationID UInt32,
fare_amount Float32,
tip_amount Float32
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(tpep_pickup_datetime)
ORDER BY (PULocationID, DOLocationID, tpep_pickup_datetime);
Load CSV using the HTTP interface or clickhouse-client:
clickhouse-client --query="INSERT INTO nyc_taxi FORMAT CSV" < nyc_taxi_1m.csv
ClickHouse tips
- Use appropriate ORDER BY keys to speed common query patterns.
- Partition by month to remove large-time-range scans.
- For very large loads, use distributed tables and bulk compressed uploads.
Step 3 — Load into Snowflake
Snowflake requires a staged upload. For a small sample you can use an internal stage.
-- Create table in Snowflake
CREATE OR REPLACE TABLE nyc_taxi (
VendorID INTEGER,
tpep_pickup_datetime TIMESTAMP_NTZ,
tpep_dropoff_datetime TIMESTAMP_NTZ,
passenger_count INTEGER,
trip_distance FLOAT,
PULocationID INTEGER,
DOLocationID INTEGER,
fare_amount FLOAT,
tip_amount FLOAT
);
-- From your local machine with SnowSQL
snowsql -q "PUT file://nyc_taxi_1m.csv @~; COPY INTO nyc_taxi FILE_FORMAT=(TYPE=CSV FIELD_OPTIONALLY_ENCLOSED_BY='\"')"
Snowflake tips
- Use an auto-suspend warehouse to avoid long-running compute charges while idle.
- Snowflake stores data compressed and separates storage/compute for flexible scaling.
- For larger datasets, stage files in cloud storage (S3/GCS) and use external stages; this ties directly into modern MLOps and pipeline patterns.
Step 4 — Three OLAP queries to run on both systems
These queries illustrate typical analytics tasks you’ll show on a resume: aggregations, time-series bucketing, and top-N with window functions.
Query A — Trips and revenue by hour
-- ClickHouse
SELECT toStartOfHour(tpep_pickup_datetime) AS hour,
count() AS trips,
sum(fare_amount + tip_amount) AS revenue
FROM nyc_taxi
GROUP BY hour
ORDER BY hour;
-- Snowflake (same logic)
SELECT date_trunc('hour', tpep_pickup_datetime) AS hour,
count(*) AS trips,
sum(fare_amount + tip_amount) AS revenue
FROM nyc_taxi
GROUP BY hour
ORDER BY hour;
Query B — Top 10 pickup zones by average fare (with 95% CI — show statistical insight)
-- ClickHouse uses aggregate functions directly
SELECT PULocationID,
avg(fare_amount) AS avg_fare,
quantileExact(0.025)(fare_amount) AS q025,
quantileExact(0.975)(fare_amount) AS q975
FROM nyc_taxi
GROUP BY PULocationID
ORDER BY avg_fare DESC
LIMIT 10;
-- Snowflake: use APPROX_PERCENTILE for approximate CI
SELECT PULocationID,
avg(fare_amount) AS avg_fare,
approx_percentile(fare_amount, 0.025) AS q025,
approx_percentile(fare_amount, 0.975) AS q975
FROM nyc_taxi
GROUP BY PULocationID
ORDER BY avg_fare DESC
LIMIT 10;
Query C — 7-day rolling trips per pickup zone (window functions)
-- ClickHouse: use window functions
SELECT PULocationID,
toDate(tpep_pickup_datetime) AS day,
count() AS trips,
avg(count()) OVER (PARTITION BY PULocationID ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS rolling_7d
FROM nyc_taxi
GROUP BY PULocationID, day
ORDER BY PULocationID, day
LIMIT 100;
-- Snowflake (similar syntax)
SELECT PULocationID,
date_trunc('day', tpep_pickup_datetime) AS day,
count(*) AS trips,
avg(count(*)) OVER (PARTITION BY PULocationID ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS rolling_7d
FROM nyc_taxi
GROUP BY PULocationID, day
ORDER BY PULocationID, day
LIMIT 100;
Step 5 — Visualize results (Python + Plotly)
Visualization helps you communicate insights in your portfolio. Use a Jupyter notebook with these connectors:
- ClickHouse: clickhouse-connect or native HTTP API
- Snowflake: snowflake-connector-python or Snowpark for Python
import pandas as pd
from clickhouse_connect import get_client
import snowflake.connector
import plotly.express as px
# ClickHouse
ch = get_client(host='localhost', port=8123)
df_ch = ch.query_df("SELECT toStartOfHour(tpep_pickup_datetime) AS hour, count() AS trips FROM nyc_taxi GROUP BY hour ORDER BY hour")
# Snowflake
ctx = snowflake.connector.connect(user='USER', password='PASS', account='ACCOUNT')
cs = ctx.cursor()
cs.execute("SELECT date_trunc('hour', tpep_pickup_datetime) AS hour, count(*) AS trips FROM nyc_taxi GROUP BY hour ORDER BY hour")
df_sf = cs.fetch_pandas_all()
# Plot
fig = px.line(df_ch, x='hour', y='trips', title='Trips per Hour (ClickHouse)')
fig.show()
fig2 = px.line(df_sf, x='HOUR', y='TRIPS', title='Trips per Hour (Snowflake)')
fig2.show()
Alternative: set up Metabase or Superset and add both databases as data sources to build side-by-side dashboards.
Step 6 — Benchmarks: measure latency, concurrency, and cost
To make this project resume-ready, capture measurable benchmarks. Use the same queries and dataset on both systems and log these metrics for each run:
- Query latency: wall-clock time per query (average of 5 runs; warm vs cold cache). See practical patterns for reducing latency in real-time apps.
- Resource usage: ClickHouse CPU/RAM (monitoring metrics), Snowflake credits used (query history shows credits).
- Cost: estimate dollar cost for the runs (Snowflake: credits * price; ClickHouse Cloud: hours * instance price or self-managed infrastructure + egress/storage).
- Concurrency: run 10 parallel clients executing Query A — note queueing effects; concurrency behaviour is often the differentiator between a low-latency engine and a horizontally scaled cloud warehouse.
Benchmark script idea (bash + Python):
# Run a query 5 times and record times
for i in {1..5}; do
start=$(date +%s%3N)
# run query via client
end=$(date +%s%3N)
echo $((end-start)) >> runtimes.txt
done
What to expect in 2026
Based on 2025-26 trends:
- ClickHouse will often show lower single-query latency for ad-hoc OLAP, especially on optimized MergeTree/order keys and when using colocated storage. ClickHouse Cloud is reducing ops friction, so students can run competitive tests without managing nodes.
- Snowflake will excel at concurrency and predictable scaling. For bursty multi-user workloads, Snowflake's separate compute model lets it scale warehouses horizontally and avoid contention — at the expense of compute credits.
- Snowflake's ongoing AI and feature investments (Snowpark, unstructured data connectors, native Python execution) make it a safe choice for teams bridging analytics and ML pipelines.
Interpreting results: tradeoffs you should highlight
Turn numbers into resume bullets and interview talking points:
- Latency vs Cost: If ClickHouse returns Query A in 120ms vs Snowflake at 700ms for single-user queries, say: “ClickHouse delivered 6x lower latency on single-node OLAP queries; Snowflake required additional compute scaling to match concurrency, increasing cost.”
- Scale & Concurrency: If Snowflake sustains 50 concurrent queries with minimal queueing, note Snowflake’s separate compute model. If ClickHouse needed a distributed cluster to handle concurrency, mention the ops overhead.
- Operational overhead: For ClickHouse self-managed, include time spent provisioning and tuning; for Snowflake, include cost per credit and whether auto-suspend reduced idle charges.
Tip: capture screenshots of dashboards, query history with credit usage, and a short CSV comparing metrics. Put these in your GitHub repo and reference them in your resume.
How to present this mini-project on your resume
Make your GitHub repo and README interview-friendly. Use this structure:
- One-line project summary: tech stack + measurable outcome (e.g., “ClickHouse vs Snowflake OLAP comparison — measured latency and cost on 1M NYC taxi trips”).
- Key metrics: table with Query latency (avg), concurrency results, and estimated cost per 1000 queries.
- Repro steps: commands to load data, run queries, and reproduce benchmarks.
- Notebooks and dashboards: link to Jupyter notebook and an exported dashboard image or embedded if using GitHub Pages.
- Short conclusions: when to pick ClickHouse vs Snowflake (one paragraph) and potential next steps.
Example resume bullet
“Built a comparative OLAP benchmark using 1M NYC taxi trips in ClickHouse and Snowflake; measured 6x lower single-query latency on ClickHouse, while Snowflake scaled to 50 concurrent queries without queueing — included cost model and reproducible Jupyter notebook (GitHub).”
Interview talking points
- “I optimized ClickHouse by selecting an ORDER BY that matched our most common GROUP BY and used monthly partitioning to reduce scan ranges.”
- “In Snowflake I used auto-suspend warehouses and ran credit-usage experiments to estimate cost at scale.”li>
- “I measured warm vs cold cache behavior — ClickHouse served faster with in-memory parts, while Snowflake’s cold cold starts added predictable compute initialization time.”
Advanced strategies and 2026 trends to extend the project
If you want to level-up this project:
- Integrate vector search and embeddings: add an NLP task (e.g., categorize free-text trip descriptors) and compare Snowflake’s vector capabilities vs ClickHouse + vector extensions (both ecosystems have expanded vector features in 2025–26).
- Pipeline automation: implement the ETL with Airbyte or Meltano and show how to scale to 10M rows; tie this into standard MLOps patterns for reproducible pipelines.
- Hybrid workloads: test Snowflake Unistore or ClickHouse materialized views for near-real-time analytics.
- Cost modeling: produce a sensitivity analysis showing cost vs concurrency and query complexity; combine cost insights with modern cost governance practices.
Quick checklist before you submit the project on your resume
- Include a brief architecture diagram (1 image).
- Publish reproducible scripts and a permissive LICENSE (MIT) on GitHub.
- Add a one-page PDF summary showing key metrics and recommendations.
- Record a 3–5 minute walkthrough screencast demonstrating queries and dashboards.
Final verdict: when to choose which for your portfolio
There’s no absolute winner — the right choice depends on what you want to showcase:
- Choose ClickHouse if you want to demonstrate raw query performance, low-latency OLAP tuning, and hands-on database optimization skills. Great for roles emphasizing analytics engineering and performance tuning.
- Choose Snowflake if you want to highlight cloud-scale design, cost/compute tradeoffs, and integrations with data science (Snowpark) and enterprise analytics. Great for roles that expect cloud data platform experience.
Actionable takeaways (do these next)
- Fork the repo and run the sample load for ClickHouse and Snowflake in a notebook.
- Run the three OLAP queries and save query history + timings.
- Create a one-slide summary with a small benchmark table and a recommendation — put it in your resume GitHub repo.
- Practice answering: “Why would you pick ClickHouse or Snowflake for X workload?” using your benchmark numbers.
Resources & further reading
- ClickHouse official docs and community: table tuning, MergeTree, and distributed tables.
- Snowflake docs: warehouses, stages, Snowpark, and pricing doc to estimate credits.
- Bloomberg (Jan 2026) reporting on ClickHouse funding round and market momentum.
Closing — your next move
This mini-project gives you a concrete way to show employers you can evaluate modern OLAP systems end-to-end: data ingestion, query design, performance benchmarking, cost analysis, and visualization. Those are exactly the skills hiring managers ask for in interviews and expect on resumes in 2026.
Ready to launch? Clone the starter repo, run the notebook, and add a one-page benchmark to your portfolio. When you're done, share the repo link in your resume and prepare two concise tradeoff statements: one favoring ClickHouse and one favoring Snowflake. Those talking points win interviews.
Want the exact starter code and a resume-ready one-page template? Click to download the ZIP or subscribe to get the checklist and starter notebooks delivered to your inbox.
Related Reading
- Fine‑Tuning LLMs at the Edge: A 2026 UK Playbook with Case Studies
- MLOps in 2026: Feature Stores, Responsible Models, and Cost Controls
- Reducing Latency for Cloud Gaming and Edge‑Delivered Web Apps in 2026: Practical Architectures and Benchmarks
- The Evolution of Serverless Cost Governance in 2026: Strategies for Predictable Billing
- Drive Foot Traffic with Trading Card Promotions: How Supermarkets Can Sell MTG & Pokémon Boosters
- Weekend Project: Install a Bluetooth Micro Speaker System in a Classic Car
- Travel 2026: 12 Best Open-Water Swim Destinations Inspired by 'Where to Go' Picks
- Short-Form Funk: Designing 2–3 Minute YouTube Shorts Tailored to BBC/YouTube Commissioning
- How Creators Can Ride the 'Very Chinese Time' Trend Without Being Offensive
Related Topics
skilling
Contributor
Senior editor and content strategist. Writing about technology, design, and the future of digital media. Follow along for deep dives into the industry's moving parts.
Up Next
More stories handpicked for you