Skip to main content
RisingWave supports Apache Iceberg in three main workflows:
  • Read external Iceberg tables with CREATE SOURCE, ad hoc queries, materialized views, or refreshable CREATE TABLE.
  • Write to external Iceberg tables with CREATE SINK.
  • Create internal Iceberg tables with CREATE TABLE ... ENGINE = iceberg, where RisingWave manages the table lifecycle and stores data in Iceberg format.
This page summarizes the current feature support. For syntax and examples, follow the linked pages in each section.

Support overview

AreaSupportNotes
External Iceberg sourcesSupportedUse CREATE SOURCE for continuous ingestion from append-only tables. Schema is inferred from Iceberg metadata.
Refreshable external Iceberg tablesSupportedUse CREATE TABLE ... WITH (connector = 'iceberg', refresh_mode = 'FULL_RELOAD') for on-demand or scheduled full reloads.
External Iceberg sinksSupportedUse CREATE SINK to write append-only or upsert streams to Iceberg tables.
Internal Iceberg tablesSupportedUse CREATE TABLE ... ENGINE = iceberg to store RisingWave-managed tables in Iceberg format.
Automatic Iceberg maintenanceSupportedAvailable for Iceberg sinks and internal Iceberg tables when a dedicated Iceberg compactor is deployed.
Manual maintenanceSupportedUse VACUUM to expire snapshots and VACUUM FULL to compact files and expire snapshots.
Built-in catalogSupportedUses RisingWave’s metastore as a JDBC-compatible Iceberg catalog. PostgreSQL or MySQL metastore is required.
External catalogsSupportedSupports storage, REST, Glue, JDBC, Hive, S3 Tables, Lakekeeper, Snowflake, and Databricks Unity Catalog with catalog-specific limits.

Reading from Iceberg

CapabilitySupportNotes
Schema inferenceSupportedIceberg source schemas are inferred automatically. Do not define columns in CREATE SOURCE.
Ad hoc snapshot queriesSupportedQuery an Iceberg source directly to read the current table snapshot.
One-time loadingSupportedAppend-only and mutable Iceberg tables are supported. RisingWave applies Iceberg equality deletes and position deletes when reading mutable tables.
Continuous ingestion from append-only tablesSupportedUse CREATE SOURCE and build materialized views on top of the source.
Continuous ingestion from mutable tablesNot supported for update/delete propagationCREATE SOURCE is designed for append-only continuous ingestion. For mutable Iceberg tables, use refreshable CREATE TABLE with FULL_RELOAD when downstream results must reflect updates and deletes.
On-demand full reloadSupportedUse REFRESH TABLE on a refreshable Iceberg table.
Scheduled full reloadSupportedSet refresh_interval_sec together with refresh_mode = 'FULL_RELOAD'.
Equality deletesSupportedSupported when reading mutable tables in snapshot/full-reload paths.
Position deletesSupportedSupported when reading mutable tables in snapshot/full-reload paths.
Predicate pushdownSupportedFilters can be pushed into Iceberg scans where applicable.
Time travelSupportedQuery committed Iceberg snapshots by timestamp or snapshot ID where the target object supports time travel.
For configuration details, see Ingest data from Iceberg tables.

Writing to Iceberg

CapabilitySupportNotes
Append-only sinkSupportedSet type = 'append-only'. Append-only sinks must use merge-on-read mode.
Upsert sinkSupportedSet type = 'upsert' and provide primary_key.
Force append-onlySupportedSet force_append_only = 'true' to write an upsert stream as inserts while ignoring deletes.
Exactly-once deliverySupportedIceberg sinks default to exactly-once in the normal sink-decoupled mode. If sink_decouple is disabled, exactly-once is disabled automatically unless configured otherwise.
Commit frequencySupportedUse commit_checkpoint_interval. The default is 60.
Commit retrySupportedUse commit_retry_num. The default is 8.
Auto-create target tableSupportedSet create_table_if_not_exists = 'true'.
PartitioningSupportedUse partition_by with column names or Iceberg transforms such as bucket, truncate, year, month, day, and hour.
Sort order keysSupportedUse order_key when creating the sink.
Merge-on-readSupportedDefault write mode for Iceberg sinks and tables.
Copy-on-writeSupported for upsert onlyAppend-only sinks and tables must use merge-on-read.
Additive schema evolutionSupportedauto.schema.change = 'true' can propagate upstream ADD COLUMN changes for exactly-once Iceberg sinks.
Iceberg format v2SupportedDefault format version.
Parquet writer settingsSupportedConfigure output file size and compression with parameters such as compaction.target_file_size_mb, compaction.write_parquet_compression, and compaction.write_parquet_max_row_group_bytes.
For configuration details, see Deliver data to Iceberg tables and Iceberg write modes.

Internal Iceberg tables

CapabilitySupportNotes
CREATE TABLE ... ENGINE = icebergSupportedCreates a RisingWave-managed table backed by Iceberg storage.
Primary-key tablesSupportedUpsert semantics are written to Iceberg through the table’s internal sink.
Append-only tablesSupportedUse APPEND ONLY with ENGINE = iceberg.
Inserts and streaming writesSupportedWrite with INSERT or stream data into the table with CREATE SINK ... INTO.
Materialized views on internal Iceberg tablesSupportedUse internal Iceberg tables as inputs to materialized views.
PartitioningSupportedUse partition_by in table WITH (...) options. The partition key must be compatible with the table primary key.
Commit frequencySupportedUse commit_checkpoint_interval; the default is 60.
Time travelSupportedQuery committed snapshots with FOR SYSTEM_TIME AS OF or FOR SYSTEM_VERSION AS OF.
Query storage selectionSupportedUse iceberg_query_storage_mode to choose Iceberg columnar reads, Hummock row reads, or optimizer-selected mode.
Built-in catalogSupportedSet hosted_catalog = true in the Iceberg connection.
Automatic maintenanceSupportedenable_compaction controls background compaction and snapshot expiration.
Manual maintenanceSupportedUse VACUUM or VACUUM FULL on the table.
For configuration details, see Create and manage internal Iceberg tables.

Catalog and storage support

Catalog or storageSupportNotes
Storage catalogSupportedUses the warehouse path directly. Supports object stores such as S3, GCS, and Azure Blob where configured.
REST catalogSupportedWorks with REST-compatible catalogs. Supports OAuth2-style credentials, bearer tokens, custom headers, SigV4 signing, and vended credentials.
LakekeeperSupportedUse Lakekeeper as a self-hosted REST catalog.
Amazon S3 TablesSupportedUses the REST catalog path with SigV4 signing.
AWS GlueSupportedSupports separate Glue credentials and assuming IAM roles.
JDBC catalogSupportedCan be used for external catalogs and for RisingWave’s built-in catalog.
Hive MetastoreSupportedAvailable as an external Iceberg catalog.
Snowflake catalogSupported for Iceberg sourcesUse Snowflake-managed Iceberg tables as read-only sources.
Databricks Unity CatalogSupported for Iceberg sinksUse Unity Catalog for Databricks-managed external Iceberg tables. CREATE SOURCE and CREATE CONNECTION are not supported for this integration.
S3 and S3-compatible storageSupportedConfigure S3 credentials, endpoint, region, path-style access, or config loading.
Google Cloud StorageSupportedConfigure GCS credentials directly or use REST catalog credential vending where applicable.
Azure Blob Storage and ADLS Gen2SupportedSupported through Iceberg storage/catalog configuration where applicable.
For complete catalog parameters, see Iceberg catalog configuration. For storage parameters, see Object storage configuration.

Maintenance support

CapabilitySupportNotes
Automatic compactionSupportedSet enable_compaction = true. Requires a dedicated Iceberg compactor node.
Snapshot expirationSupportedControlled by enable_snapshot_expiration and snapshot expiration parameters.
VACUUMSupportedExpires old snapshots for an Iceberg sink or internal Iceberg table.
VACUUM FULLSupportedRuns compaction and then expires old snapshots.
Full compactionSupportedRewrites all data files.
Small-files compactionSupportedSet compaction.type = 'small-files'.
Files-with-delete compactionSupportedSet compaction.type = 'files-with-delete'.
Dynamic maintenance updatesSupportedMany compaction and snapshot-expiration parameters can be updated with ALTER SINK.
For setup and sizing, see Deploy a dedicated Iceberg compactor and Iceberg table maintenance.

Important limitations

  • CREATE SOURCE for Iceberg is intended for append-only continuous ingestion. Use refreshable CREATE TABLE with FULL_RELOAD for mutable external Iceberg tables.
  • Do not define columns in an Iceberg CREATE SOURCE; RisingWave infers the schema from Iceberg metadata.
  • refresh_mode is supported for CREATE TABLE, not CREATE SOURCE.
  • Append-only Iceberg sinks and append-only internal Iceberg tables must use merge-on-read mode.
  • Additive schema evolution currently covers ADD COLUMN; column drops, renames, and type changes require separate handling.
  • Catalog integrations can have role-specific limits. For example, Snowflake catalog is read-only in RisingWave, while the Databricks Unity Catalog integration is documented for Iceberg sinks.