Skip to main content

dbt-starrocks

PyPI PyPI - Python Version PyPI - Downloads

This project is under development.

The dbt-starrocks package contains all the code to enable dbt to work with StarRocks.

  • Requires StarRocks version 2.5.0 or higher
    • version 3.4.x is recommended
    • StarRocks versions 2.4 and below are no longer supported

Installation

This plugin can be installed via pip:

$ pip install dbt-starrocks

Supported features

StarRocks <= 2.5 StarRocks 2.5 ~ 3.1 StarRocks >= 3.1 StarRocks >= 3.4 Feature
✅ ✅ ✅ ✅ Table materialization
✅ ✅ ✅ ✅ View materialization
❌ ❌ ✅ ✅ Materialized View materialization
❌ ✅ ✅ ✅ Incremental materialization
❌ ✅ ✅ ✅ Primary Key Model
✅ ✅ ✅ ✅ Sources
✅ ✅ ✅ ✅ Custom data tests
✅ ✅ ✅ ✅ Docs generate
❌ ❌ ✅ ✅ Expression Partition
❌ ❌ ❌ ❌ Kafka
❌ ❌ ❌ ✅ Dynamic Overwrite
❌ *4 *4 ✅ Submit task
❌ ✅ ✅ ✅ Microbatch (Insert Overwrite)
❌ ❌ ❌ ✅ Microbatch (Dynamic Overwrite)

Notice

  1. When StarRocks Version < 2.5, Create table as can only set engine='OLAP' and table_type='DUPLICATE'
  2. When StarRocks Version >= 2.5, Create table as supports table_type='PRIMARY'
  3. When StarRocks Version < 3.1 distributed_by is required
  4. Verify the specific submit task support for your version, see SUBMIT TASK.
  5. Views: when a view's SQL is unchanged, dbt run issues no DDL on the view, leaving it in place (the run log notes skip <view>, and the model still completes as a successful no-op). This avoids deactivating dependent materialized views, which StarRocks does whenever a base view is recreated, even with identical SQL.

Profile Configuration

Example entry for profiles.yml:

starrocks:
  target: dev
  outputs:
    dev:
      type: starrocks
      host: localhost
      port: 9030
      catalog: default_catalog
      schema: analytics
      username: your_starrocks_username
      password: your_starrocks_password
Option Description Required? Example
type The specific adapter to use Required starrocks
host The hostname to connect to Required 192.168.100.28
port The port to use Required 9030
catalog Specify the catalog to build models into Optional default_catalog
schema Specify the schema (database in StarRocks) to build models into Required analytics
username The username to use to connect to the server Required dbt_admin
password The password to use for authenticating to the server Required correct-horse-battery-staple
version Let Plugin try to go to a compatible starrocks version Optional 3.1.0
use_pure set to "true" to use C extensions Optional true
is_async "true" to submit suitable tasks as etl tasks. Optional true
async_query_timeout Sets the query_timeout value when submitting a task to StarRocks Optional 300
poll_interval Base delay in seconds between task status polls Optional 1
poll_max_delay Maximum delay cap in seconds for task polling Optional 600
poll_factor Growth multiplier for exponential backoff between polls Optional 2.0

More details about setting use_pure and other connection arguments here

Example

dbt seed properties(yml):

Complete configuration:

models:
  materialized: table                   // table, view, materialized_view or incremental
  engine: 'OLAP'
  keys: ['id', 'name', 'some_date']
  table_type: 'PRIMARY'                 // PRIMARY or DUPLICATE or UNIQUE
  distributed_by: ['id']
  buckets: 3                            // leave empty for auto bucketing
  indexs=[{ 'columns': 'idx_column' }]
  partition_by: ['some_date']
  partition_by_init: ["PARTITION p1 VALUES [('1971-01-01 00:00:00'), ('1991-01-01 00:00:00')),PARTITION p1972 VALUES [('1991-01-01 00:00:00'), ('1999-01-01 00:00:00'))"]
  // RANGE, LIST, or Expr partition types should be used in conjunction with partition_by configuration
  // Expr partition type requires an expression (e.g., date_trunc) specified in partition_by
  order_by: ['some_column']             // only for PRIMARY table_type
  partition_type: 'RANGE'               // RANGE or LIST or Expr Need to be used in combination with partition_by configuration
  properties: {"replication_num":"1", "in_memory": "true"}
  refresh_method: 'async'               // only for materialized view default manual
  on_view_exists: 'replace'             // only for view: use CREATE OR REPLACE VIEW instead of DROP + CREATE

  // For 'materialized=incremental' in version >= 3.4
  incremental_strategy: 'dynamic_overwrite' // Supported values: ['default', 'insert_overwrite', 'dynamic_overwrite']

  // For 'materialized=incremental' and 'incremental_strategy=microbatch'
  event_time: 'some_timestamp_column'     // The column name of the event time
  begin: '2025-01-01'                     // The start time of the incremental data
  lookback: 1                             // The lookback time of the each incremental run
  batch_size: 'day'                       // The batch size. Supported values ['year', 'month', 'day', 'hour']
  microbatch_use_dynamic_overwrite: true  // Whether to use dynamic_overwrite in version >= 3.4

dbt run config:

Example configuration:

{{ config(materialized='view') }}
{{ config(materialized='view', on_view_exists='replace') }}
{{ config(materialized='table', engine='OLAP', buckets=32, distributed_by=['id']) }}
{{ config(materialized='table', indexs=[{ 'columns': 'idx_column' }]) }}
{{ config(materialized='table', partition_by=['date_trunc("day", first_order)'], partition_type='Expr') }}
{{ config(materialized='table', table_type='PRIMARY', keys=['customer_id'], order_by=['first_name', 'last_name'] }}
{{ config(materialized='incremental', table_type='PRIMARY', engine='OLAP', buckets=32, distributed_by=['id']) }}
{{ config(materialized='incremental', partition_by=['my_partition_key'], partition_type='Expr', incremental_strategy='dynamic_overwrite') }}
{{ config(materialized='incremental', partition_by=['my_partition_key'], partition_type='Expr', incremental_strategy='microbatch', event_time='report_day', begin='2025-01-01', lookback=1, batch_size='day') }}
{{ config(materialized='incremental', partition_by=['my_partition_key'], partition_type='Expr', incremental_strategy='microbatch', event_time='report_day', begin='2025-01-01', lookback=1, batch_size='day', microbatch_use_dynamic_overwrite=true) }}
{{ config(materialized='materialized_view') }}
{{ config(materialized='materialized_view', properties={"storage_medium":"SSD"}) }}
{{ config(materialized='materialized_view', refresh_method="ASYNC START('2022-09-01 10:00:00') EVERY (interval 1 day)") }}

For materialized view only support partition_by、buckets、distributed_by、properties、refresh_method configuration.

Read From Catalog

First you need to add this catalog to starrocks. The following is an example of hive.

CREATE EXTERNAL CATALOG `hive_catalog`
PROPERTIES (
    "hive.metastore.uris"  =  "thrift://127.0.0.1:8087",
    "type"="hive"
);

How to add other types of catalogs can be found in the documentation. https://docs.starrocks.io/en-us/latest/data_source/catalog/catalog_overview Then write the sources.yaml file.

sources:
  - name: external_example
    schema: hive_catalog.hive_db
    tables:
      - name: hive_table_name

Finally, you might use below marco quote

{{ source('external_example', 'hive_table_name') }}

Write To Catalog

Set catalog and database in a model's config to build it inside an external catalog. Both are required together; catalog defaults to the profile's catalog.

{{ config(materialized='table', catalog='iceberg_catalog', database='iceberg_db') }}
{{ config(materialized='incremental', incremental_strategy='dynamic_overwrite',
          catalog='iceberg_catalog', database='iceberg_db',
          partition_by=['day(`modified_at`)']) }}

The table name comes from the model's file name (or its alias), not from database.

Only partition_by, partition_type (defaulting to Expr), partition_by_init and properties are applied to external tables. table_type, keys, distributed_by, buckets and order_by describe OLAP tables and are ignored here — Iceberg rejects key clauses outright.

Because there are no keys, unique_key cannot deduplicate an external-catalog incremental model: INSERT INTO appends. Replace partitions instead, with insert_overwrite or dynamic_overwrite. On Iceberg both replace only the partitions the query produced and leave the others in place, so they behave alike there; the difference between them applies to OLAP tables. Row-level unique_key semantics would need DELETE on Iceberg, which StarRocks only writes position delete files for from 4.1 onwards.

Dynamic Overwrite (StarRocks >= 3.4)

Add a new incremental_strategy property that supports the following values:

  • default (or omitted): Standard inserts without overwrite.
  • insert_overwrite: Will apply overwrite with dynamic_overwrite = false to the inserts.
  • dynamic_overwrite: Will apply overwrite with dynamic_overwrite = true to the inserts.

For more details on the different behaviors, see StarRocks' documentation for INSERT.

Submittable ETL tasks

The implementation of the submittable etl is located in the impl.py file.

Setting is_async: true in your profiles.yml will enable submitting suitable ETL tasks using the submit task feature of StarRocks.

This will be automatically wrapped around any statement that supports submission. Setting this manually is currently not supported by the adapter.

The following statements will be submitted automatically:

  • CREATE AS ... SELECT
  • INSERT INTO|OVERWRITE
  • CACHE SELECT ...

See StarRocks' documentation on SUBMIT TASK

Task Polling

Once the task has been submitted, the adapter will periodically poll StarRocks' information_schema.task_runs to retrieve the task status.

The polling is implemented using a configurable exponential backoff. The adapter's connection to the StarRocks' cluster will not be maintained during the waiting period. It will be re-opened right before the next status polling phase.

The polling delay is calculated as: min(poll_max_delay, poll_interval * (poll_factor ^ attempt))

Option Description Default
poll_interval Base delay in seconds between polls 1
poll_max_delay Maximum delay cap in seconds 600
poll_factor Growth multiplier for exponential backoff 2.0

For example, with poll_interval: 5, poll_factor: 1.5, poll_max_delay: 60:

Attempt Delay
1 7.5s
2 11.25s
3 16.9s
4 25.3s
5 38s
6 57s
7+ 60s (capped)

Compared to defaults (poll_interval: 1, poll_factor: 2.0, poll_max_delay: 600):

Attempt Delay
1 2s
2 4s
3 8s
4 16s
5 32s
6 64s
7 128s
8 256s
9 512s
10+ 600s (capped)

Controlling the task timeout

Using the async_query_timeout property in the profiles.yml will control the value of the query_timeout when submitting task.

It's going to be injected in the SQL query submitted to StarRocks:

submit /*+set_var(query_timeout={async_query_timeout})*/ task ...

Example profiles.yml configuration

my_profile:
  target: dev
  outputs:
    dev:
      type: starrocks
      host: host
      port: 9030
      schema: schema
      username: username
      password: password
      is_async: true
      async_query_timeout: 3600 # 1 hour
      poll_interval: 5
      poll_max_delay: 60
      poll_factor: 1.5

Test Adapter

Prepare env: install dev requirements and run StarRocks docker image

pip install -r dev_requirements.txt
docker run -p 9030:9030 starrocks/allin1-ubuntu:3.5-latest

Run the following

python3 -m pytest tests/functional

consult the project

Contributing

We welcome you to contribute to dbt-starrocks. Please see the Contributing Guide for more information.

Metadata

Release files for dbt-starrocks 1.12.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dbt-starrocks 1.12.2
File Size Uploaded
dbt_starrocks-1.12.2.tar.gz 36.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dbt-starrocks 1.12.2
File Interpreter ABI Platform
dbt_starrocks-1.12.2-py3-none-any.whl Python 3 none any Details

Total release size: 86.6 kB

Release files / dbt_starrocks-1.12.2.tar.gz

Download URL dbt_starrocks-1.12.2.tar.gz
Size 36.8 kB
Tags Source
SHA-256 checksum
How to use checksums
eccd2272fe1a2486382b832b737daea3773f08e98ceb160ad1f26d7c6ccf5d10
BLAKE2b-256 checksum
How to use checksums
0cf4d45973727911b22e64660e30428a9842c2748e112255743ce52e4ba00876
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dbt_starrocks-1.12.2-py3-none-any.whl

Download URL dbt_starrocks-1.12.2-py3-none-any.whl
Size 49.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5a73b1e3ec501e3c1cfcf3795e11ecb14b1f3ef2cb4c735753f37e2c60282f9e
BLAKE2b-256 checksum
How to use checksums
95725163d68d8bfff8e25d40fa67756179f17949e405b937a1de2be388e5b0a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

1.12.2 This release

2 release files

1.12.0

2 release files

1.11.0

2 release files

1.10.1

2 release files

1.9.0

2 release files

1.7.0

2 release files

1.6.3

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page