OpenDAL-based storage backend implementations for Apache Iceberg Rust.
| Storage Backend | Feature Flag | Status | Description |
|---|---|---|---|
| Memory | opendal-memory | ✅ Stable | In-memory storage for testing and development |
| Local Filesystem | opendal-fs | ✅ Stable | Local filesystem storage |
| Amazon S3 | opendal-s3 | ✅ Stable | Amazon S3 storage |
| Google Cloud Storage | opendal-gcs | ✅ Stable | Google Cloud Storage |
| Hugging Face | opendal-hf | ✅ Stable | Hugging Face buckets and repositories |
| Alibaba Cloud OSS | opendal-oss | 🧪 Experimental | Alibaba Cloud Object Storage Service |
| Azure Datalake | opendal-azdls | 🧪 Experimental | Azure Datalake Storage v2 |
You can enable all stable storage backends at once using the opendal-all feature flag.
Note that
opendal-ossandopendal-azdlsare currently experimental and not included inopendal-all.
Add the crate to your Cargo.toml with the feature flags for the backends you need:
[dependencies] iceberg = { version = "x.y.z" } iceberg-storage-opendal = { version = "x.y.z", features = ["opendal-s3"] } iceberg-catalog-rest = { version = "x.y.z" }
Then pass an OpenDalStorageFactory to your catalog builder:
use std::collections::HashMap; use std::sync::Arc; use iceberg::{Catalog, CatalogBuilder, TableIdent}; use iceberg_catalog_rest::{RestCatalogBuilder, REST_CATALOG_PROP_URI}; use iceberg_storage_opendal::OpenDalStorageFactory; #[tokio::main] async fn main() -> iceberg::Result<()> { let catalog = RestCatalogBuilder::default() .with_storage_factory(Arc::new(OpenDalStorageFactory::S3 { customized_credential_load: None, })) .load( "my_catalog", HashMap::from([ (REST_CATALOG_PROP_URI.to_string(), "http://localhost:8181".to_string()), ]), ) .await?; let table = catalog .load_table(&TableIdent::from_strs(["my_namespace", "my_table"])?) .await?; let scan = table.scan().select_all().build()?; let stream = scan.to_arrow().await?; Ok(()) }