Skip to main content
Version: Next

Tableau

Certified

Important Capabilities

CapabilityStatusNotes
Column-level LineageEnabled by default, configure using extract_column_level_lineage
Dataset UsageDashboard/Chart view counts, enabled using extract_usage_stats config
DescriptionsEnabled by default
Detect Deleted EntitiesEnabled by default when stateful ingestion is turned on.
DomainsRequires transformer
Extract OwnershipRequires recipe configuration
Extract TagsRequires recipe configuration
Platform InstanceEnabled by default
Table-Level LineageEnabled by default

Prerequisites

In order to ingest metadata from Tableau, you will need:

  • Tableau Server Version 2021.1.10 and above. It may also work for older versions.
  • Enable the Tableau Metadata API for Tableau Server, if its not already enabled.
  • Tableau Credentials (Username/Password or Personal Access Token)
  • The user or token must have Site Administrator Explorer permissions.

Ingestion through UI

The following video shows you how to get started with ingesting Tableau metadata through the UI.

Integration Details

This plugin extracts Sheets, Dashboards, Embedded and Published Data sources metadata within Workbooks in a given project on a Tableau site. Tableau's GraphQL interface is used to extract metadata information. Queries used to extract metadata are located in metadata-ingestion/src/datahub/ingestion/source/tableau_common.py

Concept Mapping

This ingestion source maps the following Source System Concepts to DataHub Concepts:

Source ConceptDataHub ConceptNotes
"Tableau"Data Platform
ProjectContainerSubType "Project"
Embedded DataSourceDatasetSubType "Embedded Data Source"
Published DataSourceDatasetSubType "Published Data Source"
Custom SQL TableDatasetSubTypes "View", "Custom SQL"
Embedded or External TablesDataset
SheetChart
DashboardDashboard
UserUser (a.k.a CorpUser)Optionally Extracted
WorkbookContainerSubType "Workbook"
TagTagOptionally Extracted

Lineage

Lineage is emitted as received from Tableau's metadata API for

  • Sheets contained within a Dashboard
  • Embedded or Published Data Sources depended on by a Sheet
  • Published Data Sources upstream to Embedded datasource
  • Tables upstream to Embedded or Published Data Source
  • Custom SQL datasources upstream to Embedded or Published Data Source
  • Tables upstream to Custom SQL Data Source

Caveats

  • Tableau metadata API might return incorrect schema name for tables for some databases, leading to incorrect metadata in DataHub. This source attempts to extract correct schema from databaseTable's fully qualified name, wherever possible. Read Using the databaseTable object in query for caveats in using schema attribute.

Troubleshooting

Why are only some workbooks/custom SQLs/published datasources ingested from the specified project?

This may happen when the Tableau API returns NODE_LIMIT_EXCEEDED error in response to metadata query and returns partial results with message "Showing partial results. , The request exceeded the ‘n’ node limit. Use pagination, additional filtering, or both in the query to adjust results." To resolve this, consider

  • reducing the page size using the page_size config param in datahub recipe (Defaults to 10).
  • increasing tableau configuration metadata query node limit to higher value.

PERMISSIONS_MODE_SWITCHED error in ingestion report

This error occurs if the Tableau site is using external assets. For more detail, refer to the Tableau documentation Manage Permissions for External Assets.

Follow the below steps to enable the derived permissions:

  1. Sign in to Tableau Cloud or Tableau Server as an admin.
  2. From the left navigation pane, click Settings.
  3. On the General tab, under Automatic Access to Metadata about Databases and Tables, select the Automatically grant authorized users access to metadata about databases and tables check box.

CLI based Ingestion

Install the Plugin

The tableau source works out of the box with acryl-datahub.

Starter Recipe

Check out the following recipe to get started with ingestion! See below for full configuration options.

For general pointers on writing and running a recipe, see our main recipe guide.

source:
type: tableau
config:
# Coordinates
connect_uri: https://prod-ca-a.online.tableau.com
site: acryl
platform_instance: acryl_instance
project_pattern: ["^default$", "^Project 2$", "^/Project A/Nested Project B$"]

# Credentials
username: "${TABLEAU_USER}"
password: "${TABLEAU_PASSWORD}"

# Options
ingest_tags: True
ingest_owner: True
default_schema_map:
mydatabase: public
anotherdatabase: anotherschema

sink:
# sink configs

Config Details

Note that a . is used to denote nested fields in the YAML recipe.

FieldDescription
connect_uri 
string
Tableau host URL.
add_site_container
boolean
When enabled, sites are added as containers and therefore visible in the folder structure within Datahub.
Default: False
database_hostname_to_platform_instance_map
map(str,string)
default_schema_map
map(str,string)
extract_column_level_lineage
boolean
When enabled, extracts column-level lineage from Tableau Datasources
Default: True
extract_lineage_from_unsupported_custom_sql_queries
boolean
[Experimental] Whether to extract lineage from unsupported custom sql queries using SQL parsing
Default: False
extract_project_hierarchy
boolean
Whether to extract entire project hierarchy for nested projects.
Default: True
extract_usage_stats
boolean
[experimental] Extract usage statistics for dashboards and charts.
Default: False
force_extraction_of_lineage_from_custom_sql_queries
boolean
[Experimental] Force extraction of lineage from custom sql queries using SQL parsing, ignoring Tableau metadata
Default: False
ingest_embed_url
boolean
Ingest a URL to render an embedded Preview of assets within Tableau.
Default: False
ingest_external_links_for_charts
boolean
Ingest a URL to link out to from charts.
Default: True
ingest_external_links_for_dashboards
boolean
Ingest a URL to link out to from dashboards.
Default: True
ingest_hidden_assets
boolean
When enabled, hidden views and dashboards are ingested into Datahub. If a dashboard or view is hidden in Tableau the luid is blank. Default of this config field is True.
Default: True
ingest_multiple_sites
boolean
When enabled, ingests multiple sites the user has access to. If the user doesn't have access to the default site, specify an initial site to query in the site property. By default all sites the user has access to will be ingested. You can filter sites with the site_name_pattern property. This flag is currently only supported for Tableau Server. Tableau Cloud is not supported.
Default: False
ingest_owner
boolean
Ingest Owner from source. This will override Owner info entered from UI
Default: False
ingest_tables_external
boolean
Ingest details for tables external to (not embedded in) tableau as entities.
Default: False
ingest_tags
boolean
Ingest Tags from source. This will override Tags entered from UI
Default: False
max_retries
integer
Number of retries for failed requests.
Default: 3
page_size
integer
[advanced] Number of metadata objects (e.g. CustomSQLTable, PublishedDatasource, etc) to query at a time using the Tableau API.
Default: 10
password
string
Tableau password, must be set if authenticating using username/password.
platform_instance
string
The instance of the platform that all assets produced by this recipe belong to. This should be unique within the platform. See https://datahubproject.io/docs/platform-instances/ for more details.
platform_instance_map
map(str,string)
project_path_separator
string
The separator used for the project_path_pattern field between project names. By default, we use a slash. You can change this if your Tableau projects contain slashes in their names, and you'd like to filter by project.
Default: /
session_trust_env
boolean
Configures the trust_env property in the requests session. If set to false (default value) it will bypass proxy settings. See https://requests.readthedocs.io/en/latest/api/#requests.Session.trust_env for more information.
Default: False
site
string
Tableau Site. Always required for Tableau Online. Use emptystring to connect with Default site on Tableau Server.
Default:
sql_parsing_disable_schema_awareness
boolean
[Experimental] Ignore pre ingested tables schemas during parsing of SQL queries (allows to workaround ingestion errors when pre ingested schema and queries are out of sync)
Default: False
ssl_verify
One of boolean, string
Whether to verify SSL certificates. If using self-signed certificates, set to false or provide the path to the .pem certificate bundle.
Default: True
token_name
string
Tableau token name, must be set if authenticating using a personal access token.
token_value
string
Tableau token value, must be set if authenticating using a personal access token.
username
string
Tableau username, must be set if authenticating using username/password.
workbook_page_size
integer
[advanced] Number of workbooks to query at a time using the Tableau API.
Default: 1
env
string
Environment to use in namespace when constructing URNs.
Default: PROD
lineage_overrides
TableauLineageOverrides
Mappings to change generated dataset urns. Use only if you really know what you are doing.
lineage_overrides.database_override_map
map(str,string)
lineage_overrides.platform_override_map
map(str,string)
permission_ingestion
PermissionIngestionConfig
Configuration settings for ingesting Tableau groups and their capabilities as custom properties.
permission_ingestion.enable_workbooks
boolean
Whether or not to enable group permission ingestion for workbooks. Default: True
Default: True
permission_ingestion.group_name_pattern
AllowDenyPattern
Filter for Tableau group names when ingesting group permissions. For example, you could filter for groups that include the term 'Consumer' in their name by adding '^.*Consumer$' to the allow list.By default, all groups will be ingested. You can both allow and deny groups based on their name using their name, or a Regex pattern. Deny patterns always take precedence over allow patterns.
Default: {'allow': ['.*'], 'deny': [], 'ignoreCase': True}
permission_ingestion.group_name_pattern.ignoreCase
boolean
Whether to ignore case sensitivity during pattern matching.
Default: True
permission_ingestion.group_name_pattern.allow
array
List of regex patterns to include in ingestion
Default: ['.*']
permission_ingestion.group_name_pattern.allow.string
string
permission_ingestion.group_name_pattern.deny
array
List of regex patterns to exclude from ingestion.
Default: []
permission_ingestion.group_name_pattern.deny.string
string
project_path_pattern
AllowDenyPattern
Filters Tableau projects by their full path. For instance, 'My Project/Nested Project' targets a specific nested project named 'Nested Project'. This is also useful when you need to exclude all nested projects under a particular project. You can allow or deny projects by specifying their path or a regular expression pattern. Deny patterns always override allow patterns. By default, all projects are ingested.
Default: {'allow': ['.*'], 'deny': [], 'ignoreCase': True}
project_path_pattern.ignoreCase
boolean
Whether to ignore case sensitivity during pattern matching.
Default: True
project_path_pattern.allow
array
List of regex patterns to include in ingestion
Default: ['.*']
project_path_pattern.allow.string
string
project_path_pattern.deny
array
List of regex patterns to exclude from ingestion.
Default: []
project_path_pattern.deny.string
string
project_pattern
AllowDenyPattern
[deprecated] Use project_path_pattern instead. Filter for specific Tableau projects. For example, use 'My Project' to ingest a root-level Project with name 'My Project', or 'My Project/Nested Project' to ingest a nested Project with name 'Nested Project'. By default, all Projects nested inside a matching Project will be included in ingestion. You can both allow and deny projects based on their name using their name, or a Regex pattern. Deny patterns always take precedence over allow patterns. By default, all projects will be ingested.
Default: {'allow': ['.*'], 'deny': [], 'ignoreCase': True}
project_pattern.ignoreCase
boolean
Whether to ignore case sensitivity during pattern matching.
Default: True
project_pattern.allow
array
List of regex patterns to include in ingestion
Default: ['.*']
project_pattern.allow.string
string
project_pattern.deny
array
List of regex patterns to exclude from ingestion.
Default: []
project_pattern.deny.string
string
projects
array
[deprecated] Use project_pattern instead. List of tableau projects
Default: ['default']
projects.string
string
site_name_pattern
AllowDenyPattern
Filter for specific Tableau sites. By default, all sites will be included in the ingestion. You can both allow and deny sites based on their name using their name, or a Regex pattern. Deny patterns always take precedence over allow patterns. This property is currently only supported for Tableau Server. Tableau Cloud is not supported.
Default: {'allow': ['.*'], 'deny': [], 'ignoreCase': True}
site_name_pattern.ignoreCase
boolean
Whether to ignore case sensitivity during pattern matching.
Default: True
site_name_pattern.allow
array
List of regex patterns to include in ingestion
Default: ['.*']
site_name_pattern.allow.string
string
site_name_pattern.deny
array
List of regex patterns to exclude from ingestion.
Default: []
site_name_pattern.deny.string
string
tags_for_hidden_assets
array
Tags to be added to hidden dashboards and views. If a dashboard or view is hidden in Tableau the luid is blank. This can only be used with ingest_tags enabled as it will overwrite tags entered from the UI.
Default: []
tags_for_hidden_assets.string
string
stateful_ingestion
StatefulStaleMetadataRemovalConfig
Base specialized config for Stateful Ingestion with stale metadata removal capability.
stateful_ingestion.enabled
boolean
Whether or not to enable stateful ingest. Default: True if a pipeline_name is set and either a datahub-rest sink or datahub_api is specified, otherwise False
Default: False
stateful_ingestion.remove_stale_metadata
boolean
Soft-deletes the entities present in the last successful run but missing in the current run with stateful_ingestion enabled.
Default: True

Code Coordinates

  • Class Name: datahub.ingestion.source.tableau.tableau.TableauSource
  • Browse on GitHub

Questions

If you've got any questions on configuring ingestion for Tableau, feel free to ping us on our Slack.