dbt-confluent
The dbt adapter for Confluent Cloud Flink SQL.
Build, test, and manage streaming data transformations on Confluent Cloud using dbt's familiar development workflow.
Overview
dbt-confluent lets you use dbt to define and run SQL transformations on Confluent Cloud's fully managed Apache Flink service. It supports both batch-style and streaming materializations, enabling continuous data pipelines defined as dbt models.
Features:
- Standard dbt materializations (table, view, ephemeral) adapted for Flink SQL
- Streaming-native materializations (
streaming_table,streaming_source) for continuous data pipelines - Integration with Confluent Cloud connectors (e.g., Datagen/Faker) via
streaming_source distributed_byconfig to control Kafka partitioning via theDISTRIBUTED BY HASH(...) INTO N BUCKETSclause- Schema drift detection on re-runs (columns, WITH options,
distributed_by) — surfaces every violation in one error - Adopt existing tables and statements deployed outside dbt via the
aliasandstatement_nameconfigs
See Materializations for the full list and details.
Installation
pip install dbt-confluent
or with uv:
uv add dbt-confluent
Requires Python 3.10+.
Configuration
After installing, scaffold a new project with:
dbt init my_project
Select confluent as the adapter and fill in the prompts for your Confluent Cloud credentials (API key, compute pool, environment, etc.).
You can authenticate with either a Global Confluent Cloud API key (global_api_key / global_api_secret, which works against every route) or a Flink-region key (flink_api_key / flink_api_secret). The compute_pool_id is optional: omit it to run statements in the environment+region default compute pool. This profile-level pool is the default for every model; individual models can override it with config(compute_pool_id='...') — see Materializations.
Concept mapping
Confluent Cloud Flink uses different terminology than traditional databases. Here's how dbt concepts map to Flink and Confluent Cloud:
| dbt concept | Flink concept | Confluent Cloud entity |
|---|---|---|
database |
Catalog | Environment |
schema |
Database | Kafka cluster |
Schema configuration
Unlike most dbt adapters, dbt-confluent cannot create or drop schemas — a dbt schema maps to a Flink database (Kafka cluster) in Confluent Cloud, which is managed externally. Both the dbname in your profiles.yml and any model-level schema config must reference an existing Flink database by name:
# dbt_project.yml
models:
my_project:
+schema: my-kafka-cluster
Usage
Streaming table
A streaming table creates a table and runs a continuous INSERT query against it:
-- models/pageviews_enriched.sql
{{
config(
materialized='streaming_table',
with={'changelog.mode': 'append'}
)
}}
SELECT
p.user_id,
p.page_url,
u.username
FROM {{ ref('pageviews') }} p
JOIN {{ ref('users') }} u ON p.user_id = u.user_id
Streaming source
A streaming source creates a connector-backed source table. The model SQL defines the column definitions:
-- models/datagen_users.sql
{{
config(
materialized='streaming_source',
connector='faker',
with={'rows-per-second': '10'}
)
}}
`user_id` INT,
`username` STRING,
`email` STRING
See Materializations for the full list and details.
Known Limitations
- No schema management: Flink databases (Kafka clusters) cannot be created or dropped — they are managed in Confluent Cloud.
- No table renames:
ALTER TABLE RENAMEis not supported; to effectively rename a model you must drop and recreate the underlying table, which fortable,streaming_table, andstreaming_sourcematerializations requires running with--full-refresh. - No transactions: Flink SQL is non-transactional.
- No snapshots: Flink SQL lacks the batch operations (MERGE, UPDATE) required by dbt snapshots.
- No incremental: dbt's batch-incremental semantics does not map to Flink's continuous processing model. Use
streaming_tableinstead. - Drift detection for WITH options: Schema drift detection only verifies that user-specified
WITHoptions exist with correct values. It cannot detect when options are removed from the config (because connectors may add default options that cannot be distinguished from user-specified ones). Use--full-refreshto change or remove WITH options. Drift detection can be disabled per-model withconfig(on_schema_drift='ignore'). See Materializations for details.
Development
git clone https://github.com/confluentinc/dbt-confluent
cd dbt-confluent
uv sync --dev
See CONTRIBUTING.md for changelog and contribution guidelines.
Code quality
uv run ruff check dbt/ tests/
uv run ruff format --check dbt/ tests/
Running tests
Tests require a Confluent Cloud environment. Set the following environment variables (or add them to a test.env file):
export CONFLUENT_ENV_ID=env-xxxxxx
export CONFLUENT_ORG_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
export CONFLUENT_COMPUTE_POOL_ID=lfcp-xxxxx
export CONFLUENT_CLOUD_PROVIDER=aws
export CONFLUENT_CLOUD_REGION=us-west-6
export CONFLUENT_TEST_DBNAME=dbname
export CONFLUENT_FLINK_API_KEY=xxx
export CONFLUENT_FLINK_API_SECRET=xxx
# Optional: a second compute pool (same environment + region, different from
# CONFLUENT_COMPUTE_POOL_ID) used only by the per-model compute pool test.
# The test is skipped when this is unset or equal to CONFLUENT_COMPUTE_POOL_ID.
export CONFLUENT_COMPUTE_POOL_ID_2=lfcp-yyyyy
uv run pytest
Versioning
This adapter follows semantic versioning and is versioned independently from dbt Core. Compatibility with dbt Core is declared via dependencies (currently requires dbt-core~=1.11).
License
Apache-2.0 — see LICENSE for details.
Release files for dbt-confluent 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dbt_confluent-0.3.1.tar.gz | 155.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dbt_confluent-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 206.3 kB
Release files / dbt_confluent-0.3.1.tar.gz
| Download URL | dbt_confluent-0.3.1.tar.gz |
|---|---|
| Size | 155.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
def9243982ed05749dabc85bb2904f9181ff4e75d935af9943894f5356712965
|
|
BLAKE2b-256 checksum How to use checksums |
9cc3f9e12a2ea36581d8a3618ba99a38ef9727efc07ade055b0d17d00af881f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / dbt_confluent-0.3.1-py3-none-any.whl
| Download URL | dbt_confluent-0.3.1-py3-none-any.whl |
|---|---|
| Size | 51.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ce61a28d584963f6f3d6bec3429cf03375162e2966065500ad68dc1f3c96138a
|
|
BLAKE2b-256 checksum How to use checksums |
f32d2446270d6704528bacfb6c87202607e1d9dd6f98b21997833de6168c966f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|