How to programmatically rename fields in Tableau Desktop (e.g. Python)?
I have a huge data source with 500+ fields, and would like to rename them based on a mapping table I have (in Excel). Is it possible to do this programmatically (e.g. via Python) on my Tableau Desktop?
Tableau offers a couple of Python packages like Tableau Server Client (TSC); tabcmd; But they are meant for the server, and provide limited capabilities.
Answer
Yes, it is possible to programmatically rename fields in Tableau using Python, even though Tableau's APIs (like TSC
or tabcmd
) primarily target Tableau Server or Tableau Online, which focus on server-side operations and automation.
To achieve the renaming of fields based on a mapping table in Excel, you can leverage the following approach using Python:
Steps to Rename Fields in Tableau Using Python
-
Extract the Field Names from Tableau:
- Since you're working with Tableau Desktop, you'd need to extract the metadata of your workbook (field names, etc.) using Tableau's Python integration via the Tableau Hyper API. This will allow you to interact with
.hyper
files directly. - Use
tableauhyperapi
to read the data source, extract the column names, and compare them with your mapping table.
- Since you're working with Tableau Desktop, you'd need to extract the metadata of your workbook (field names, etc.) using Tableau's Python integration via the Tableau Hyper API. This will allow you to interact with
-
Prepare the Mapping Table:
- If you have an Excel sheet containing the old and new field names (mapping table), you can read that with
pandas
.
- If you have an Excel sheet containing the old and new field names (mapping table), you can read that with
-
Update the Field Names:
- Once you have the mapping, you can apply the changes to the field names in the Tableau Hyper file.
-
Recreate or Update the Tableau Workbook:
- You can either update the
.hyper
file or create a new one with the renamed fields. - After modifying the
.hyper
file, you can update your Tableau workbook by using the Tableau Hyper API or by manually linking the updated.hyper
file.
- You can either update the
Example: Rename Fields Using the Hyper API
1. Install Required Libraries
First, you'll need the following Python packages:
tableauhyperapi
: To interact with.hyper
files.pandas
: To load and process the mapping table from Excel.
pip install tableauhyperapi pandas openpyxl
2. Prepare Python Script
Here’s how you can proceed with the renaming of fields using the Hyper API and the mapping table from Excel:
import pandas as pd
from tableauhyperapi import HyperProcess, Telemetry, Connection, TableDefinition, SqlType, CreateMode, TableName, HyperException
from tableauhyperapi import Column, SqlType, TableDefinition
# Load the mapping table from Excel
mapping_df = pd.read_excel('field_mapping.xlsx') # Adjust to your file path and sheet name
# Assuming the mapping file has columns 'Old Name' and 'New Name'
field_mapping = dict(zip(mapping_df['Old Name'], mapping_df['New Name']))
# Define the Hyper file paths
input_hyper = "input_data.hyper"
output_hyper = "output_data.hyper"
# Open the Hyper file and rename fields
with HyperProcess(telemetry=Telemetry.SEND_USAGE_DATA_TO_TABLEAU) as hyper:
with Connection(endpoint=hyper.endpoint, database=input_hyper, create_mode=CreateMode.NONE) as connection:
# Get all the tables in the .hyper file
tables = connection.catalog.get_table_names()
# Iterate through each table and apply the field renaming
for table in tables:
# Get the schema and table structure
table_definition = connection.catalog.get_table_definition(table)
# Create a new list of columns with renamed fields
new_columns = [
Column(field_mapping.get(col.name, col.name), col.type) # Rename column if it's in the mapping
for col in table_definition.columns
]
# Define new table definition with renamed fields
new_table_definition = TableDefinition(table, new_columns)
# Create the new Hyper file
with Connection(endpoint=hyper.endpoint, database=output_hyper, create_mode=CreateMode.CREATE_AND_REPLACE) as new_connection:
new_connection.catalog.create_table(new_table_definition)
# Copy data from old to new table
new_connection.execute_command(f"INSERT INTO {table} SELECT * FROM {table}")
print(f"Renaming complete! The new Hyper file is saved as {output_hyper}.")
Explanation:
-
Load Mapping Table:
- We load the mapping table from an Excel file using
pandas.read_excel()
. The mapping is expected to have two columns: "Old Name" and "New Name".
- We load the mapping table from an Excel file using
-
Hyper API Workflow:
- We use the
tableauhyperapi
to open an existing.hyper
file (input_data.hyper
) for reading. - Then, we extract the table metadata (column names) and check if they match the "Old Name" in the mapping table. If a match is found, we rename the field using the "New Name" from the mapping.
- We use the
-
Create New Hyper File:
- A new
.hyper
file (output_data.hyper
) is created with the renamed columns. - Data is copied from the old table to the newly renamed table.
- A new
-
Final Output:
- The script creates a new
.hyper
file (output_data.hyper
) with the updated field names.
- The script creates a new
Alternative: Use Tableau Prep (For More Complex Transformations)
If you're looking for a more visual and interactive way to perform such tasks on Tableau Desktop, you could also use Tableau Prep. Tableau Prep allows you to visually clean and transform data, including renaming fields, which could make this process easier without programming. You can also use Tableau Prep’s Python integration to automate these tasks as part of your workflow.
Automating Tableau Workbook Updates
If your goal is to update the field names in an actual Tableau workbook (e.g., .twb
or .twbx
file), that would be a more complex task since .twb
files are XML-based, and you would need to edit the XML directly.
You could use xml.etree.ElementTree
or a similar XML library to parse and update the field names in a .twb
file. However, this would require a deeper understanding of the Tableau workbook XML schema.
Conclusion:
While Tableau Desktop itself doesn’t offer direct Python integration for field renaming, you can interact with .hyper
files programmatically using the Tableau Hyper API. This allows you to rename fields based on an Excel mapping table and generate new .hyper
files that can be used in Tableau Desktop or Tableau Server.