DuckDB in de Cloud: Serverless Analytics in 2026

Gepubliceerd: 6 april 2026
Leestijd: 12 minuten
Data Engineering

Ontdek hoe DuckDB serverless analytics transformeert: van lokale queries tot cloud-native pipelines voor Nederlandse data engineers.

Wat is DuckDB en waarom is het in 2026 onmisbaar?

De wereld van data-analyse beweegt snel. Waar we vijf jaar geleden nog massale clusters opstartten voor elke analytische query, zien we in 2026 een fundamenteel andere aanpak: lichtgewicht, in-process databases die razendsnel OLAP-queries uitvoeren zonder enige infrastructuur overhead. DuckDB is daarin de absolute uitblinker geworden.

DuckDB is een in-process analytische database — vergelijkbaar met SQLite, maar dan volledig geoptimaliseerd voor analytische workloads (OLAP). Het draait embedded in je Python-, R-, of Java-applicatie, heeft geen aparte serverprocess nodig, en presteert verbluffend goed op columnaire data. Denk aan Parquet-bestanden op S3, CSV's, JSON, en zelfs live queries over Arrow-tabellen in geheugen.

DuckDB in één zin

DuckDB is een embedded, serverless OLAP-database die direct in je applicatieproces draait, razendsnel analytische queries uitvoert over lokale én cloud-opgeslagen data, en geen aparte databaseserver vereist — ideaal voor moderne serverless data pipelines in 2026.

In 2026 zijn er drie krachtige redenen waarom DuckDB dominant is geworden in de data engineering wereld:

Snelheid zonder overhead

Queries over miljoenen rijen in milliseconden, direct op Parquet-bestanden in S3 of GCS, zonder data te kopiëren of ETL-stappen.

Native cloud integratie

Via MotherDuck en native S3/Azure/GCS-support werkt DuckDB naadloos met cloudopslag. Serverless analytics is nu de default.

Developer-first design

Pip install, drie regels Python, en je voert SQL uit over gigabytes data. Geen cluster, geen config, geen DevOps-overhead.

Hoe werkt DuckDB in de Cloud?

DuckDB's kracht in een cloud-context komt voort uit drie pijlers: columnar vectorized execution, native cloud storage support, en MotherDuck als managed cloud-laag. Laten we elk onderdeel doorlopen.

Architectuur: In-process OLAP

Traditionele databases (PostgreSQL, MySQL) draaien als een aparte server; jouw applicatie verbindt via een netwerkprotocol. DuckDB draait binnen je applicatieproces. Dit elimineert netwerk-latency voor lokale data en maakt embedding in Lambda-functies, Airflow-tasks, of dbt-modellen triviaal.

1

Data Locatie: Cloud Storage

Je data leeft in S3, Azure Blob, of GCS als Parquet- of CSV-bestanden. DuckDB leest deze direct via zijn native HTTP/object-storage client — geen download vereist.

2

Query Pushdown

DuckDB gebruikt Parquet's column pruning en row group filtering. Alleen de benodigde kolommen en rijen worden van S3 gelezen — dit spaart enorm op dataoverdracht en kosten.

3

Vectorized Execution

Queries worden uitgevoerd via SIMD-geoptimaliseerde vectoroperaties in batches van 1024+ rijen. Dit benut moderne CPU-architectuur optimaal.

4

Resultaat Terug naar Applicatie

Het queryresultaat is beschikbaar als Pandas DataFrame, Arrow Table, of JSON — direct in je Python/R/Node-omgeving, zonder extra serialisatie-stappen.

MotherDuck: DuckDB als Managed Cloud Service

MotherDuck (gelanceerd in 2023, volwassen geworden in 2025-2026) is de managed cloud-extensie van DuckDB. Het voegt persistente opslag, toegangsbeheer, en een collaborative query-omgeving toe aan DuckDB's kracht. Het unieke model: hybrid execution. Een deel van de query draait lokaal (op jouw laptop of Lambda), een deel in de cloud. DuckDB besluit automatisch wat waar het efficiëntst is.

MotherDuck Hybrid Execution

Met MotherDuck kun je schrijven: SELECT * FROM md:mijn_database.orders JOIN local_table ON .... De cloud-tabel wordt in MotherDuck gefilterd; de lokale tabel blijft lokaal. De join vindt plaats op het meest efficiënte punt. Dit maakt echte serverless analytics mogelijk zonder vendor lock-in op één locatie.

Praktische Codevoorbeelden

Genoeg theorie — laten we zien hoe DuckDB werkt in realistische data engineering scenario's.

1. Direct Parquet-bestanden opvragen vanuit S3


import duckdb

# Verbinding aanmaken (in-memory, geen server nodig)
conn = duckdb.connect()

# AWS credentials instellen (ook via env vars of IAM role)
conn.execute("""
    INSTALL httpfs;
    LOAD httpfs;
    SET s3_region = 'eu-west-1';
    SET s3_access_key_id = 'AKIAIOSFODNN7EXAMPLE';
    SET s3_secret_access_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY';
""")

# Query direct op S3 Parquet-bestanden (partitioned dataset)
resultaat = conn.execute("""
    SELECT
        jaar,
        maand,
        regio,
        SUM(omzet)        AS totaal_omzet,
        COUNT(DISTINCT klant_id) AS unieke_klanten,
        AVG(omzet)        AS gem_omzet
    FROM read_parquet(
        's3://mijn-datalake/verkoop/jaar=*/maand=*/*.parquet',
        hive_partitioning = TRUE
    )
    WHERE jaar = 2026
      AND regio IN ('Noord-Holland', 'Zuid-Holland', 'Utrecht')
    GROUP BY jaar, maand, regio
    ORDER BY maand, totaal_omzet DESC
""").df()  # Direct als Pandas DataFrame

print(resultaat.head(20))
    

2. Serverless Pipeline: S3 → Transformatie → Nieuw Parquet


import duckdb
import boto3
from datetime import date

def run_daily_aggregatie(event, context):
    """
    AWS Lambda functie: dagelijkse aggregatie van ruwe events
    naar een gesommeerde tabel, opgeslagen als Parquet op S3.
    """
    vandaag = date.today().strftime("%Y-%m-%d")
    
    conn = duckdb.connect()
    conn.execute("INSTALL httpfs; LOAD httpfs;")
    conn.execute(f"SET s3_region = 'eu-west-1';")

    # Transformatie: rauwe clickstream → dagelijkse KPI's
    conn.execute(f"""
        COPY (
            SELECT
                datum,
                pagina_url,
                COUNT(*)                    AS pageviews,
                COUNT(DISTINCT sessie_id)   AS unieke_sessies,
                COUNT(DISTINCT gebruiker_id) AS unieke_gebruikers,
                AVG(tijd_op_pagina_sec)     AS gem_tijd_sec,
                SUM(CASE WHEN conversie THEN 1 ELSE 0 END) AS conversies
            FROM read_parquet(
                's3://raw-events/clickstream/datum={vandaag}/*.parquet'
            )
            GROUP BY datum, pagina_url
        )
        TO 's3://processed-data/kpi/datum={vandaag}/kpi_summary.parquet'
        (FORMAT PARQUET, COMPRESSION 'zstd')
    """)

    return {{"statusCode": 200, "body": f"KPI's voor {vandaag} succesvol verwerkt"}}
    

3. MotherDuck: Persistente Cloud Database


import duckdb

# Verbinden met MotherDuck (token via env var MD_TOKEN)
conn = duckdb.connect("md:mijn_analytics_db")

# Tabel aanmaken in de cloud
conn.execute("""
    CREATE TABLE IF NOT EXISTS verkoop_maandelijks AS
    SELECT * FROM read_parquet('s3://mijn-datalake/verkoop/2026/**/*.parquet')
""")

# Hybrid query: cloud data + lokale CSV joinen
lokale_klanten = conn.execute("""
    SELECT
        v.maand,
        k.segment,
        SUM(v.omzet) AS omzet_per_segment
    FROM md:mijn_analytics_db.verkoop_maandelijks v
    JOIN read_csv_auto('/tmp/klant_segmenten.csv') k
        ON v.klant_id = k.klant_id
    GROUP BY v.maand, k.segment
    ORDER BY v.maand, omzet_per_segment DESC
""").df()

print(lokale_klanten)
    

4. DuckDB als dbt-backend voor Serverless Transformaties


# dbt project: profiles.yml
mijn_project:
  target: dev
  outputs:
    dev:
      type: duckdb
      path: ':memory:'                        # In-memory voor dev
      extensions:
        - httpfs
      settings:
        s3_region: eu-west-1
    prod:
      type: duckdb
      path: 'md:productie_db'                 # MotherDuck voor prod
      extensions:
        - httpfs

# models/verkoop_kpi.sql
{{ config(materialized='table') }}

SELECT
    DATE_TRUNC('week', besteldatum)          AS week,
    categorie,
    SUM(omzet)                               AS week_omzet,
    COUNT(DISTINCT klant_id)                 AS actieve_klanten,
    SUM(omzet) / COUNT(DISTINCT klant_id)   AS omzet_per_klant,
    RANK() OVER (
        PARTITION BY DATE_TRUNC('week', besteldatum)
        ORDER BY SUM(omzet) DESC
    )                                        AS categorie_rank
FROM {{ ref('stg_bestellingen') }}
WHERE besteldatum >= CURRENT_DATE - INTERVAL 90 DAY
GROUP BY 1, 2
    

Pro Tip: DuckDB Secret Manager (v0.10+)

Vanaf DuckDB 0.10 kun je credentials veilig opslaan met CREATE SECRET:
CREATE SECRET s3_creds (TYPE S3, KEY_ID '...', SECRET '...', REGION 'eu-west-1');
Dit werkt ook in MotherDuck en maakt credential-beheer in teams veel overzichtelijker.

DuckDB vs. de Alternatieven

DuckDB is niet de enige speler in de serverless analytics ruimte. Hoe verhoudt het zich tot bekende alternatieven?

Aspect DuckDB / MotherDuck BigQuery Serverless Athena (AWS) Snowflake Polars
Deployment model In-process / managed cloud Fully managed SaaS Serverless query engine Managed cloud DW In-process (library)
SQL-interface ✅ Volledig SQL ✅ Volledig SQL ✅ Presto SQL ✅ Volledig SQL ⚠️ DataFrame API (experimenteel SQL)
Kosten klein volume 💚 Gratis / laag 🟡 Per TB gescand 🟡 Per TB gescand 🔴 Credits verplicht 💚 Gratis
Kosten groot volume 🟡 MotherDuck-abonnement 🟡 Schaalbaar maar duur 🟡 Schaalbaar 🔴 Duur bij hoge concurrency 💚 Gratis (zelf schalen)
Setup complexiteit 💚 pip install duckdb 🟡 GCP project, IAM 🟡 AWS setup, Glue catalog 🔴 Account, warehouse config 💚 pip install polars
Multi-user / teams 🟡 Via MotherDuck ✅ Native ✅ Via IAM ✅ Native ❌ Niet out-of-the-box
Lokaal ontwikkelen ✅ Identiek aan productie ❌ Emulator beperkt ❌ Moeilijk lokaal testen ❌ Altijd cloud verbinding ✅ Volledig lokaal
Petabyte-scale ⚠️ Beperkt (single-node) ✅ Gebouwd voor ✅ Gebouwd voor ✅ Gebouwd voor ⚠️ Beperkt

De conclusie uit deze vergelijking is helder: DuckDB excelleert in de middenmarkt — datasets van megabytes tot tientallen gigabytes, teams die snel willen itereren, en use cases waar lokale ontwikkeling en cloud productie identiek moeten zijn. Voor echte petabyte-workloads met hoge concurrency blijven BigQuery en Snowflake de betere keuze.

Best Practices voor DuckDB in Productie

DuckDB is eenvoudig te starten maar vereist aanpak en discipline voor robuuste productie-pipelines. Hier zijn de meest kritieke best practices voor 2026.

Praktijkcase: E-commerce Data Platform

Een Nederlandse e-commerce retailer met 50M+ orders per jaar migreerde hun rapportage-stack van Redshift naar DuckDB + MotherDuck. Resultaat: 78% kostenbesparing, query-latency van 45 seconden naar 3 seconden voor standaard dashboards, en het team van 3 data engineers kon hun infrastructuur volledig elimineren. Ze draaien nu DuckDB in GitHub Actions voor dagelijkse dbt-runs en MotherDuck als de gedeelde analytical database voor het BI-team.

1. Partitioneer je Data Slim


-- Gebruik Hive-partitionering voor grote datasets
-- Schrijf altijd naar datum-partities
COPY (SELECT * FROM staging_orders WHERE order_date = '2026-01-15')
TO 's3://datalake/orders/year=2026/month=01/day=15/'
(FORMAT PARQUET, PARTITION_BY (year, month, day));

-- Query met partitie-pruning (DuckDB leest alleen relevante bestanden)
SELECT * FROM read_parquet(
    's3://datalake/orders/year=2026/month=01/**/*.parquet',
    hive_partitioning = TRUE
)
WHERE year = 2026 AND month = 1 AND day >= 10;
    

2. Memory Management in Serverless Omgevingen


import duckdb

conn = duckdb.connect()

# Configureer memory limits voor Lambda (bijv. 512MB functie)
conn.execute("""
    SET memory_limit = '400MB';
    SET temp_directory = '/tmp/duckdb_temp';  -- Lambda's /tmp
    SET max_temp_directory_size = '2GB';      -- Spill-to-disk
    SET threads = 2;                          -- Pas aan CPU cores aan
""")

# Voor grote aggregaties: gebruik streaming waar mogelijk
resultaat = conn.execute("""
    SELECT
        regio,
        SUM(omzet) AS totaal
    FROM read_parquet('s3://...')
    GROUP BY regio
""").fetchdf()  # .fetchdf() streamt resultaat efficient
    

3. Connection Pooling en Thread Safety

Belangrijk: DuckDB is niet thread-safe met één connectie

Een DuckDB-connectie mag slechts door één thread tegelijk worden gebruikt. In multi-threaded webapplicaties (FastAPI, Flask) gebruik je read-only connecties of een connection pool. DuckDB ondersteunt meerdere read-only verbindingen op hetzelfde databasebestand simultaan. Schrijf-bewerkingen vereisen exclusieve toegang.


# Veilig pattern voor FastAPI + DuckDB
from contextlib import contextmanager
import duckdb
import threading

_local = threading.local()

def get_connection():
    """Thread-lokale DuckDB connectie voor read-only queries."""
    if not hasattr(_local, 'conn') or _local.conn is None:
        _local.conn = duckdb.connect(
            'md:analytics_db',
            read_only=True  # Meerdere threads kunnen simultaan lezen
        )
    return _local.conn

@contextmanager
def duckdb_conn():
    conn = get_connection()
    try:
        yield conn
    except Exception as e:
        _local.conn = None  # Reset bij fout
        raise e

# Gebruik in een FastAPI endpoint:
from fastapi import FastAPI
app = FastAPI()

@app.get("/kpi/omzet")
async def get_omzet(regio: str):
    with duckdb_conn() as conn:
        result = conn.execute(
            "SELECT SUM(omzet) FROM verkoop WHERE regio = ?", [regio]
        ).fetchone()
    return {"omzet": result[0]}
    

4. Monitoring en Observability


-- DuckDB query profiling inschakelen
PRAGMA enable_profiling;
PRAGMA profiling_output='/tmp/query_profile.json';

-- Query uitvoeren
SELECT * FROM orders WHERE status = 'geleverd' LIMIT 100;

-- Uitleg van query plan bekijken
EXPLAIN ANALYZE
SELECT regio, SUM(omzet)
FROM read_parquet('s3://datalake/orders/**/*.parquet')
GROUP BY regio;

-- Interne statistieken opvragen
SELECT * FROM duckdb_settings() WHERE name LIKE '%memory%';
SELECT * FROM duckdb_extensions();
    

5. CI/CD voor DuckDB Pipelines


# .github/workflows/dbt-duckdb.yml
name: Daily dbt Pipeline

on:
  schedule:
    - cron: '0 6 * * *'  # Elke dag om 6:00 UTC
  workflow_dispatch:

jobs:
  dbt-run:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Python setup
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'
          
      - name: Install dependencies
        run: pip install dbt-duckdb duckdb

      - name: Run dbt models
        env:
          MD_TOKEN: ${{ secrets.MOTHERDUCK_TOKEN }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_KEY }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET }}
        run: |
          dbt deps
          dbt run --target prod --select tag:daily
          dbt test --target prod --select tag:daily
          dbt docs generate
    

Conclusie: Wanneer Wel en Niet DuckDB Gebruiken?

DuckDB is in 2026 uitgegroeid tot een van de meest impactvolle tools in het data engineering ecosysteem. Maar zoals elk gereedschap heeft het zijn optimale use cases en zijn grenzen.

Gebruik DuckDB Vermijd DuckDB
Analytics op datasets tot ~100GB Petabyte-schaal met hoge concurrency
Serverless/Lambda data pipelines OLTP-workloads (veel writes, kleine transactions)
Data science & exploratie (notebooks) Multi-user schrijf-intensieve applicaties
dbt-transformaties (dev én prod) Real-time streaming (gebruik Flink/Kafka)
Lokale Parquet/CSV/JSON analyse Gedeelde database met strikte ACID-garanties
Kosten-efficiënte rapportage-stacks Enterprise multi-tenant SaaS databases
Prototyping en MVP-dataproducten Workloads die hoge write-throughput vereisen

De grootste verschuiving die DuckDB teweeg heeft gebracht is democratisering: een solo data engineer of small team kan nu een productie-kwaliteit analytisch platform bouwen zonder de infrastructuur-overhead van Snowflake of BigQuery. Met MotherDuck als beheerde laag, native S3-support, en een rijpe dbt-integratie is de tool volwassen genoeg voor serieuze productie-workloads.

Voor 2026 en verder verwachten we dat DuckDB's hybride model — lokale compute voor kleine datasets, cloud-offloading voor grote — de standaard wordt voor teams die wendbaarheid en kostenefficiëntie boven brute schaalbaarheid stellen. De vraag is niet meer of je DuckDB gebruikt, maar waar in je stack je het inzet.

Volgende Stappen

  • Start met pip install duckdb en analyseer een lokaal CSV-bestand in 2 minuten
  • Registreer een gratis MotherDuck account voor persistente cloud opslag
  • Integreer dbt-duckdb in je bestaande dbt-project voor snellere lokale ontwikkeling
  • Migreer één bestaande S3-query van Athena naar DuckDB en vergelijk de kosten

Hulp Nodig bij Implementatie?

Zoek je een Data Engineer of advies over dit onderwerp?