Area: Ingestion Issues
Sub-Area: Tableau Connector — Column-Level Lineage
Issue
When running a Tableau ingestion recipe that includes column-level lineage (CLL) extraction, the pipeline fails because the connector generates invalid schemaField URNs. This occurs specifically when Tableau workbooks or datasources use Custom SQL as a data source and the SQL references tables whose upstream URN cannot be fully resolved — for example, cross-database references, aliased tables, or tables from a source not yet ingested into DataHub. The connector's get_upstream_fields_from_custom_sql() method passes an unresolved or None table reference to make_schema_field_urn(), which enforces strict URN validation and raises an assertion error. The resulting malformed URN — containing an empty column name portion — is rejected by the DataHub backend, causing the entire ingestion run to fail.
Error Messages
Unable to emit metadata to DataHub GMS: Failed to validate record with class com.linkedin.dataset.UpstreamLineage: ERROR :: /fineGrainedLineages/15/upstreams/0 :: "Provided urn urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:<platform>,<dataset-path>,PROD),)" is invalidinvalid schemaField URN
You Might Be Asking
- Why does my Tableau ingestion fail with an invalid URN error even though my recipe worked before?
- What causes a
schemaFieldURN to have a trailing comma and an empty field name? - How can I unblock Tableau ingestion while a permanent fix is applied?
- Is this a bug in the Tableau connector or a configuration problem in my recipe?
Solution
The recommended workaround is to disable column-level lineage extraction for Custom SQL datasources in your Tableau recipe. This unblocks ingestion while preserving table-level lineage and all other metadata extraction.
-
Identify the failure point. Review your ingestion logs for lines containing
invalid schemaField URNorFailed to validate record with class com.linkedin.dataset.UpstreamLineage. The malformed URN will have a trailing comma and an empty field name, for example:
The empty string after the final comma is the missing column name — this confirms the Custom SQL column-level lineage parsing path is the root cause.urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:<platform>,<dataset-path>,PROD),) -
Disable column-level lineage for Custom SQL in your recipe. Add or update the following flag in the
source.configsection of your Tableau ingestion recipe YAML:
Settingsource: type: tableau config: # ... your existing connection settings ... extract_column_level_lineage: falseextract_column_level_lineagetofalseprevents the connector from attempting to resolve column references from Custom SQL datasources, eliminating the code path that produces the invalid URN. - Re-run the ingestion recipe. After saving the updated recipe, trigger the ingestion run again. Table-level lineage, dataset metadata, and all other Tableau entities will continue to be extracted normally.
-
(Optional) Narrow the scope with table pattern filters. If you need column-level lineage for some datasources but not others, you can use
tableau_project_patternorworkbook_patternto exclude only the workbooks or projects that contain the problematic Custom SQL datasources:source: type: tableau config: # ... your existing connection settings ... workbook_pattern: deny: - ".*<problematic-workbook-name>.*" -
Upgrade to a patched connector version. A fix has been merged in the DataHub open-source repository (PR #18301) that adds null and validity checks before calling
make_schema_field_urn(), causing invalid column references to be skipped with a warning log instead of crashing the pipeline. Upgrade to a connector version that includes this fix to restore column-level lineage extraction safely. Confirm the target version with your DataHub administrator or support contact.
Additional Notes
-
Root cause detail: The failure occurs in
tableau.pyinside theget_upstream_fields_from_custom_sql()method. When the SQL parser cannot fully resolve acolumn_ref.tablevalue (returningNone, a raw table name, or a partial path instead of a valid URN), the result is passed directly tomake_schema_field_urn()inmce_builder.py, which enforces a strict assertion. Defensive null checks present elsewhere in the same file were missing from this specific code path. - Affected scenarios: Custom SQL datasources that reference cross-database tables, aliased tables, or upstream tables not yet ingested into DataHub are most likely to trigger this bug.
-
Table-level lineage is unaffected: Disabling
extract_column_level_lineagedoes not affect table-level upstream lineage, dataset schema extraction, ownership, tags, or any other Tableau metadata. - Version context: This issue has been observed on DataHub connector versions in the v1.3.x range. The permanent fix is included in the patch referenced above; consult the DataHub release notes to confirm when it becomes available in your deployment channel.
-
URN format reference: A valid
schemaFieldURN must follow the patternurn:li:schemaField:(<datasetUrn>,<fieldPath>). A URN ending in a bare comma —urn:li:schemaField:(...,)— indicates an emptyfieldPathand will always be rejected by the DataHub GMS validation layer.
Related Documentation
- Tableau Ingestion Source — DataHub Docs
- Ingestion Recipe Reference
- Lineage Feature Guide
- GitHub PR #18301 — Fix: null safety for Tableau Custom SQL column-level lineage URN construction
Tags: tableau, ingestion, column-level-lineage, schemaField-urn, custom-sql, invalid-urn, lineage, tableau-connector, ingestion-failure, urn-validation