Skip to content
Engines & IntegrationsLast updated: May 14, 2026

Apache Doris and Apache Iceberg

Apache Doris is a high-performance real-time analytical database with native Iceberg external catalog support, enabling Doris SQL to query Iceberg tables.

apache doris icebergdoris iceberg catalogdoris lakehouse icebergapache doris external catalogdoris iceberg integration

Apache Doris and Apache Iceberg

Apache Doris is an open-source, real-time analytical database built for high-concurrency, low-latency SQL analytics. It supports Apache Iceberg through a Multi-Catalog feature that allows Doris to connect to external Iceberg catalogs and query Iceberg tables alongside Doris internal tables, enabling a unified analytical experience over both real-time and historical data.

Apache Doris has a large and active community (especially in China and APAC) and is used at scale by companies including Meituan, Xiaomi, and JD.com for lakehouse analytics.

Doris Multi-Catalog for Iceberg

Doris’ Multi-Catalog feature (introduced in Doris 1.2+) supports Iceberg as an external catalog type:

Creating an Iceberg Catalog

-- Doris: create an Iceberg catalog using Hive Metastore
CREATE CATALOG iceberg_hms PROPERTIES (
    'type' = 'iceberg',
    'iceberg.catalog.type' = 'hms',
    'hive.metastore.uris' = 'thrift://hms-host:9083',
    's3.region' = 'us-east-1',
    's3.endpoint' = 's3.amazonaws.com',
    's3.access_key' = 'AKxx...',
    's3.secret_key' = 'xxx...'
);

-- Using AWS Glue
CREATE CATALOG iceberg_glue PROPERTIES (
    'type' = 'iceberg',
    'iceberg.catalog.type' = 'glue',
    'glue.region' = 'us-east-1',
    's3.access_key' = '...',
    's3.secret_key' = '...'
);

-- Using REST Catalog (Apache Polaris)
CREATE CATALOG iceberg_polaris PROPERTIES (
    'type' = 'iceberg',
    'iceberg.catalog.type' = 'rest',
    'uri' = 'https://my-polaris.example.com',
    'iceberg.catalog.credential' = 'client-id:client-secret',
    'warehouse' = 'my-warehouse'
);

Querying Iceberg Tables

-- Switch to the Iceberg catalog
SWITCH iceberg_polaris;

-- List databases (Iceberg namespaces)
SHOW DATABASES;

-- Query Iceberg table
SELECT
    date_trunc('month', order_date) AS month,
    region,
    SUM(total) AS revenue,
    COUNT(*) AS order_count
FROM analytics.orders
WHERE order_date >= '2026-01-01'
GROUP BY 1, 2
ORDER BY month, revenue DESC;

-- Cross-catalog join (Doris internal + Iceberg external)
SELECT d.product_name, SUM(i.total) AS revenue
FROM internal.dim.products d
JOIN iceberg_polaris.analytics.orders i ON d.product_id = i.product_id
WHERE i.order_date >= '2026-01-01'
GROUP BY d.product_name;

Iceberg Time Travel in Doris

-- Query as of a specific snapshot
SELECT * FROM iceberg_polaris.analytics.orders
FOR VERSION AS OF 8027658604211071520;

-- Query as of a timestamp
SELECT * FROM iceberg_polaris.analytics.orders
FOR TIME AS OF '2026-05-14 10:00:00';

Doris Iceberg Performance Optimizations

Doris applies Iceberg-native optimizations:

Doris vs. Dremio for Iceberg Analytics

AspectApache DorisDremio
Primary strengthHigh-concurrency real-time OLAPAI analytics + semantic layer
AI integrationNoYes (full AI Semantic Layer)
Streaming ingestYes (native Routine Load)No
Open CatalogExternal catalog onlyNative Apache Polaris
Best forReal-time dashboards + Iceberg historyAI agents, BI, multi-engine governance

In many architectures, Doris and Dremio serve complementary roles: Doris handles high-concurrency real-time analytics and Doris’s internal tables for fresh data, while Dremio serves governed AI analytics and semantic layer access over the same Iceberg historical data.

📚 Go Deeper on Apache Iceberg

Alex Merced has authored three hands-on books covering Apache Iceberg, the Agentic Lakehouse, and modern data architecture. Pick up a copy to master the full ecosystem.

← Back to Iceberg Knowledge Base