Title
Page icon
Create new category
Edit page index title
Edit category
Edit link
Asset Correlation for Redshift, Glue, Pub/Sub, and Iceberg
Pipeline lineage links to Catalog assets when your job emits OpenLineage events (START plus COMPLETE or FAIL) with input and output datasets, and the target asset is already onboarded in ADOC. Each dataset needs a namespace, a name, and sometimes facets.
Use this guide to confirm what your emitter should produce, and what ADOC checks when matching an event dataset to a Catalog asset. If lineage does not link as expected, compare your event payload against the tables in the relevant section below.
Naming reference: OpenLineage dataset naming spec
Airflow inlets and outlets
If you declare datasets on Airflow operators using inlets or outlets, use the OpenLineage Dataset type so events carry a spec-compliant namespace, name, and facets:
Do not use Airflow's scheduling Dataset type (airflow.datasets.Dataset) — it produces a different URI shape and will not correlate to Catalog assets. Airflow's scheduling Dataset is for DAG scheduling dependencies only. Build each OpenLineage Dataset with the namespace and name (and facets when needed) from the source-specific sections below.
When correlation succeeds
ADOC links a pipeline dataset node to a Catalog asset when all of the following are true:
The dataset format matches one of the supported source patterns in this guide.
A Catalog assembly exists for that source type and has been crawled.
The connection properties on the assembly match what ADOC derives from the event.
The Catalog asset UID matches what ADOC derives from the event name (or symlink name).
If any of these checks fail, the pipeline node is still created, but without a linked Catalog asset.
How ADOC picks the source type
For datasets with symlinks that have a TABLE identifier, ADOC correlates using the TABLE symlink's namespace and name, not the top-level values. This is required for:
Iceberg tables whose primary namespace is an S3 path.
Glue tables emitted with S3-only primaries.
A valid TABLE symlink has type: "TABLE" and a namespace ADOC can resolve — a Glue ARN, a REST catalog URL, or another supported scheme.
For most sources, ADOC checks two things from each dataset:
Check | Meaning |
|---|---|
Connection match | The assembly's connection property must equal (or regex-match) a value derived from the event |
Asset UID match | The crawled asset UID must end with the table or topic identifier derived from the event |
Pub/Sub uses a dedicated, topic-based match (see the Pub/Sub section below).
Apache Iceberg
Emit catalog and symlinks facets on each table input and output. The top-level namespace and name can be an S3 path — the facets define the table.
Do not use iceberg:// as a namespace for facet-based events. Iceberg is identified by facets, not a URI scheme.
Iceberg REST catalog
Emit:
Validate against the catalog:
Event field | Must match catalog |
|---|---|
facets.catalog.framework | iceberg |
facets.catalog.type | rest |
facets.symlinks TABLE namespace | https:// or http:// REST catalog URL (same catalog as metadataUri) |
facets.symlinks TABLE name | Table name as demo.orders (or table/demo/orders, normalized to demo.orders) |
facets.catalog.metadataUri | Assembly connection |
Example asset UID: my-iceberg-assembly.demo.orders
Iceberg on AWS Glue
Emit:
Validate against the catalog:
Event field | Must match catalog |
|---|---|
facets.catalog.framework | iceberg |
facets.catalog.type | glue |
TABLE symlink namespace |
|
TABLE symlink name | sales.orders or table/sales/orders |
Region in the Glue ARN | Assembly connection |
Example asset UID: my-iceberg-glue-assembly.sales.orders
Iceberg vs. plain Glue
What you see in the event | ADOC treats it as |
|---|---|
catalog.framework=iceberg plus a valid TABLE symlink | Iceberg |
Glue ARN namespace, no Iceberg catalog facet | AWS Glue |
S3 primary plus Glue TABLE symlink, no Iceberg facet | AWS Glue |
S3 primary, no symlinks, no Iceberg facet | File path — out of scope, no Catalog link |
AWS Glue tables (Hive or Spark, not Iceberg)
Use this pattern when the job reads or writes a Glue Data Catalog table without Iceberg facets.
Direct Glue ARN (preferred)
Emit:
name can also be table/sales/orders.
Validate against the catalog:
Event field | Required pattern | Must match catalog |
|---|---|---|
namespace |
| — |
name |
| Asset UID |
Region in ARN |
| Connection |
Catalog source type | — | AWS Glue |
Invalid formats (no correlation):
Fused ARN — table path embedded in the namespace, for example
arn:aws:glue:us-east-1:123456789012:table/sales/ordersas the namespace.Non-ARN prefix — for example
aws:glue:us-east-1:123456789012instead ofarn:aws:glue:us-east-1:123456789012.
S3 primary with a Glue symlink
Use this pattern when the emitter reports only S3 paths. Add a symlinks facet pointing at the Glue table:
ADOC uses the TABLE symlink for correlation, following the same Glue ARN and name rules as above. Do not include an Iceberg catalog facet unless the table is actually Iceberg.
Amazon Redshift
Use the OpenLineage warehouse naming form — typically produced automatically by Airflow or Spark Redshift integrations.
Emit:
Validate against the catalog:
Event field | Required pattern | Must match catalog |
|---|---|---|
namespace |
| Connection |
name |
| Asset UID |
Cluster |
| Part of the JDBC hostname |
Region |
| Part of the JDBC hostname |
Port |
| JDBC port in the connection URL |
ADOC builds the following connection regex from the namespace:
Do not use jdbc:redshift://… as the dataset namespace — that form is not recognized as Redshift and will not correlate.
Google Cloud Pub/Sub
ADOC links topics only. The Catalog asset is the Pub/Sub topic — subscription names do not link, even when the job reads through a subscription.
Emit the topic your job consumes or produces:
Validate against the catalog:
Event field | Required pattern | Must match catalog |
|---|---|---|
namespace |
| — |
name |
| Topic ID = |
Project |
| Connection |
Topic ID |
| Listed in connection |
Example asset UID: my-pubsub-assembly.orders-events
Does not correlate:
Event name | Why |
|---|---|
| Subscriptions are not Catalog assets |
| Malformed — falls back to the OpenLineage UID only |
| projectId does not match the connection |
Validation checklist
Before testing, confirm:
A Catalog assembly is created and crawled for the target source.
Connection properties are populated as described in each "Validate against catalog" table above.
OpenLineage events follow the naming spec.
Iceberg Spark jobs include
catalogandsymlinksfacets on table inputs and outputs.
If lineage does not link
Symptom | Check in the event | Check in the catalog |
|---|---|---|
Node exists but has no assetId | Dataset format matches a section above | Asset crawled and assembly exists |
Glue table shows as S3 only | Add symlinks TABLE with the Glue ARN, or Iceberg facets | Source type is AWS Glue or Iceberg, as appropriate |
Iceberg-on-Glue treated as plain Glue |
| Source type is Iceberg (AWS_GLUE), not plain Glue |
Pub/Sub not linking |
| projectId, pubsub.topics.0, and pubsub.assets.0.topic.name all match |
Redshift not linking | namespace must be | redshift.url regex matches the cluster, region, and port |
Iceberg REST not linking | metadataUri in the event | iceberg.httpuri on the connection equals the same URL |
Glue / Iceberg-on-Glue not linking | Region in the Glue ARN | aws.region on the connection matches |
What's next
For Spark-specific OpenLineage setup, see Spark OpenLineage Integration.
For dbt-specific setup, see dbt Core OpenLineage Integrations.
For additional help, contact www.acceldata.force.com OR call our service desk +1 844 9433282
Copyright © 2025