Iceberg Tables
- concept
Enterprise Analytics provides read-only query access to Apache Iceberg tables through external catalogs, enabling unified queries across data lake and operational data without moving data.
Apache Iceberg is a high-performance open table format for large-scale analytic datasets. Enterprise Analytics connects to Iceberg catalogs to query Iceberg tables stored in external object storage — such as AWS S3, GCS, and Azure Blob Storage — using existing links for authentication.
To get started, use CREATE CATALOG to register an Iceberg catalog, then use CREATE EXTERNAL COLLECTION to expose individual Iceberg tables for querying.
Iceberg Concepts
Catalog
An Iceberg catalog is a metadata registry that maps table names to their metadata files. It manages table locations and handles create, drop, load, and list operations on tables.
In Enterprise Analytics, a catalog is a named entity registered with CREATE CATALOG.
Catalogs are globally unique and do not belong to an Analytics database.
Namespace
Namespaces logically group Iceberg tables within a catalog, similar to a database or schema in relational systems. A catalog can contain multiple namespaces, and namespaces can be nested.
catalog_name
├── namespace1
│ ├── table1
│ └── table2
└── namespace2
└── table3
When creating an external collection on a catalog, you specify the namespace and table name in the WITH clause.
For more information, see CREATE EXTERNAL COLLECTION on a Catalog.
Supported Catalog Types
| Source | Description | Required Link |
|---|---|---|
|
AWS Glue Data Catalog — the centralized metadata repository in the AWS ecosystem. |
AWS link |
|
AWS Glue accessed via the Iceberg REST endpoint, using Sigv4-signed credentials. |
AWS link |
|
Amazon S3 Tables — a managed Iceberg table bucket on Amazon S3. |
AWS link |
|
Google BigLake Metastore — GCP managed metadata service with an Iceberg REST catalog API. |
GCS link |
|
Nessie — an open source catalog with Git-like branching semantics. |
HTTP link |
|
Nessie accessed via its REST catalog implementation. |
HTTP link |
|
REST-compatible Iceberg catalogs. |
HTTP link |
Supported Storage Locations
Iceberg data files can reside in the following object storage locations:
-
AWS S3
-
Google Cloud Storage (GCS)
-
Azure Blob Storage
Types Mapping
The following table describes the type mapping between Iceberg types and Enterprise Analytics types:
| Iceberg Type | Enterprise Analytics Type | Comments |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Not supported |
Can be parsed as |
|
|
|
|
|
|
|
|
|
|
|
Can be converted to |
|
|
Can be converted to |
|
|
Can be converted to |
|
|
Can be converted to |
|
Not supported |
|
|
Not supported |
|
|
Not supported |
|
|
Not supported |
[1] DECIMAL is not natively supported in Enterprise Analytics.
To parse DECIMAL values as DOUBLE, set decimal-to-double to "true" in CREATE EXTERNAL COLLECTION.
If decimal-to-double is not set, Enterprise Analytics returns an error: Decimal is not supported. To parse it as DOUBLE, set decimal-to-double to true.
This property is not enabled by default because it’s a temporary workaround.
When Enterprise Analytics adds native DECIMAL support, this property is no longer required.
[2] Enterprise Analytics parses datetime types to milliseconds precision.
To return the original long value (microseconds since epoch for TIMESTAMP, nanoseconds since epoch for TIMESTAMP_NANO), set timestamp-as-long to "true" in CREATE EXTERNAL COLLECTION.
[3] To return DATE as INTEGER (epoch days since 1970-01-01), set date-as-int to "true" in CREATE EXTERNAL COLLECTION.
[4] To return TIME as INTEGER (milliseconds since midnight), set time-as-int to "true" in CREATE EXTERNAL COLLECTION.
Query Iceberg Tables
-
Create Authentication Links — Create one or more links to authenticate access to the Iceberg catalog and the underlying object storage. The catalog and data file locations can use the same link or different links, depending on your setup and permissions.
The link used to authenticate the catalog and the link used to read the data files can differ. For example, a Nessie catalog may use an HTTP link for catalog authentication while the underlying data files are stored in S3 and require an AWS link. -
Register the Iceberg Catalog — Use
CREATE CATALOGto connect Enterprise Analytics to a supported Iceberg catalog. Once registered, the catalog is available globally in Enterprise Analytics and automatically appears in the Analytics Workbench UI. -
Create an External Collection — Use
CREATE EXTERNAL COLLECTIONto expose an Iceberg table for querying. Once created, the Iceberg table can be queried using SQL++ in the same way as any external collection.
Filtration
When Enterprise Analytics reads an Iceberg table, the following filtrations are applied in order:
-
Only the files belonging to the specified table are scanned — no other table’s files are accessed.
-
If a
WHEREclause is provided, Enterprise Analytics applies predicates to perform partition pruning and manifest-level exclusion before reading data files. -
Only columns referenced in the
SELECTclause are projected — not all columns in the table are read.
Partition pruning, manifest-level exclusion, and column projection reduce the amount of data scanned for selective queries. See Create an Iceberg Table for details.
Use Time Travel
Every write to an Iceberg table creates a new snapshot.
Enterprise Analytics lets you query any past snapshot of an Iceberg external collection using AT SNAPSHOT or AT TIMESTAMP in a SQL++ statement, without modifying the collection definition.
You can also pin a collection to a specific snapshot permanently by setting snapshotId or snapshotTimestamp in CREATE EXTERNAL COLLECTION.
AT TIMESTAMP
Returns data from the most recent snapshot at or before the specified timestamp.
SELECT * FROM <collection-name> AT TIMESTAMP '<timestamp>'
The timestamp must be a string in one of the following formats:
-
Milliseconds since Unix epoch:
'<ms-since-unix-epoch>' -
Date:
'yyyy-MM-dd' -
Datetime:
'yyyy-MM-ddTHH:mm:ss'
SELECT * FROM usersTable AT TIMESTAMP '<ms-since-unix-epoch>'
SELECT * FROM usersTable AT TIMESTAMP '2022-07-01'
SELECT * FROM usersTable AT TIMESTAMP '2022-07-01T13:12:01'
AT SNAPSHOT
Returns data from a specific snapshot by its ID.
SELECT * FROM <collection-name> AT SNAPSHOT '<snapshot-id>'
SELECT * FROM usersTable AT SNAPSHOT '1339696213265401120'
Listing Snapshots
To find available snapshot IDs and timestamps, use the following data source functions or REST endpoints.
Data Source Functions
List all snapshots for an Iceberg external collection:
SELECT * FROM list_iceberg_snapshots("<database>", "<scope>", "<collection>") AS x;
List all catalogs, namespaces, and tables registered in Enterprise Analytics:
SELECT * FROM list_iceberg_catalogs() AS x;
SELECT * FROM list_iceberg_namespaces("<catalog-name>") AS x;
SELECT * FROM list_iceberg_tables("<catalog-name>", "<namespace>") AS x;
REST API
| Endpoint | Description |
|---|---|
|
Returns all catalogs registered in Enterprise Analytics. |
|
Returns all namespaces in the specified catalog. |
|
Returns all tables in the specified namespace. |
|
Returns all snapshots for the specified Iceberg external collection. |
FAQ
Can You Use Both snapshotId and snapshotTimestamp in the Same Query?
No — specify only one at a time. Providing both returns an error.
What Snapshot Does Enterprise Analytics Read if No Snapshot Is Specified?
Enterprise Analytics reads from the latest snapshot of the table.
What’s the Difference Between a Query-Level Snapshot and a Collection-Level Snapshot?
Setting snapshotId or snapshotTimestamp in CREATE EXTERNAL COLLECTION pins the collection to that snapshot permanently — all queries against that collection use it by default.
Using AT SNAPSHOT or AT TIMESTAMP in a query overrides the collection-level setting for that query only.