A Tableau to Databricks migration is really one of three projects: repoint Tableau to governed Databricks tables so the data and logic move while the dashboards stay, import the workbooks into Databricks AI/BI dashboards and metric views, or rebuild the dashboards in another BI tool. Databricks documents an /importBI command in Genie Code, described in its release notes as generally available, that reads Tableau .twb, .twbx, .tds, and .tdsx files and creates AI/BI dashboards and metric views, and Tableau connects to Databricks SQL warehouses through its native connector. The risk sits in calculations that depend on the view, such as INCLUDE and EXCLUDE expressions and table calculations, in which identity reaches Databricks for row-level security, and in small differences like ranking and date truncation, so every number should be reconciled before a workbook goes live.
Mature Tableau estates accumulate business logic in places never meant to hold it: the same calculated field copied across dozens of workbooks, extracts refreshing on independent schedules, and Prep flows running on individual desktops. This page covers the three paths, how Tableau concepts map to Databricks, what the Genie Code import does and does not do, how to keep Tableau on top of Databricks safely, and where results drift. For the services side, see our Databricks migration services overview, and for the pipelines feeding your dashboards, our ETL migration to Databricks article.
The phrase "Tableau to Databricks migration" covers three different projects, and conflating them is the most common cause of scope creep:
| Path | What Moves | Best When | Watch For |
|---|---|---|---|
| Repoint Tableau | Data sources, extracts, and Prep logic move to governed Databricks tables, and workbooks are repointed | Users like Tableau, and duplicated logic and extract sprawl are the pain | The authentication model for row-level security, and live-query versus extract performance |
| Import into AI/BI dashboards | Workbooks become Databricks AI/BI dashboards and metric views through /importBI or partner tools | You want data, BI, and AI on one governed platform | Reviewing parity, because features and design may differ |
| Rebuild in another BI tool | Dashboards are redesigned in a different platform, with Databricks as the data layer | You are standardizing on another BI tool | A full redesign, as in our Tableau to Power BI, Tableau to Microsoft Fabric, and Tableau to Amazon QuickSight articles |
A backend repoint has the lowest user impact, because people keep the interface they know, and it is the foundation for any later replacement. Many estates mix paths: heavy, widely shared dashboards stay on Tableau, while new self-service work lands in AI/BI dashboards. For help comparing the front-end options, see our MicroStrategy vs Power BI vs Tableau comparison, and for broader scoping, our enterprise BI migration services page.
The motivation is rarely that Tableau is a weak visualization tool. It is a question of where transformation logic should live:
If your estate also feeds from Oracle, SQL Server, or Teradata, the upstream moves are covered in our Oracle, SQL Server and SSIS, and Teradata articles.
These are functional equivalents, not one-to-one replacements, because Tableau evaluates many objects relative to the current view while SQL evaluates them at a fixed grain:
| Tableau | Databricks | Note |
|---|---|---|
| Published and embedded data sources | Unity Catalog tables or views in a gold schema, or metric views | One governed object replaces many copies |
| Joins and relationships | Explicit SQL joins in silver or gold tables | Tableau relationships pick join behavior at query time, so check for row duplication |
| Row-level calculated fields | Derived columns or SQL expressions | Confirm function semantics such as date truncation |
| LOD expressions (FIXED) | Window functions or grouped subqueries joined back | Predictable once the filter behavior is decided |
| LOD expressions (INCLUDE and EXCLUDE) and table calculations | Usually kept in Tableau, or redesigned as measures | They depend on the view, and /importBI covers some cases |
| Data source filters | WHERE clauses in views | Applied before every query |
| User filters and row-level security | Unity Catalog row filters and column masks | The connection's identity decides whose scope applies |
| Parameters | Tableau parameters, or AI/BI dashboard parameters | Keep in Tableau unless the dashboard moves |
| Hyper extracts (.hyper) | Delta tables served by a SQL warehouse | Extracts remain optional for concurrency or offline use |
| Tableau Prep flows | Notebooks or Lakeflow pipelines run by Lakeflow Jobs | Each Prep step becomes versioned, testable code |
| Extract refresh schedules | Lakeflow Jobs that run upstream, and then trigger refreshes | Triggering can use Tableau's REST API |
| Dashboards | AI/BI dashboards through /importBI, or stay in Tableau | Depends on the path you chose |
Databricks documents an import path for Tableau files, which makes the dashboard route much faster to start than a manual rebuild. According to the Databricks documentation and release notes:
Partner accelerators follow the same idea, with vendors advertising their own coverage rates for typical Tableau workbooks. Treat every figure as a vendor claim, and treat every import as a first draft: review the generated dashboard for visual parity, check each calculation against Tableau's output, and expect to redesign features that have no equivalent. An import does not prove the numbers match, so the reconciliation work in this page applies in full.
If you repoint rather than replace, the connection details matter as much as the tables:
For most repoint projects, curated gold tables or views are the simpler target, with metric views added where one governed set of measures is worth the extra constraints. Performance comes from sizing SQL warehouses for real concurrency, pre-aggregating in gold, and using liquid clustering on frequently filtered columns, and it should be measured, not assumed, because live queries can be faster or slower than Hyper extracts.
According to Tableau's order of operations, FIXED expressions are evaluated before dimension filters, so an ordinary dashboard filter does not change them unless it is a context filter, while INCLUDE and EXCLUDE expressions are evaluated after dimension filters. Top N filters are also applied before ordinary dimension filters unless those are context filters. That is why FIXED logic moves into SQL predictably and INCLUDE logic loses its ability to respond to the view.
A FIXED expression such as the first order date per customer, {FIXED [Customer ID] : MIN([Order Date])}, is a window function in Databricks SQL. This is an illustrative example, not a client engagement.
SELECT
order_id,
customer_id,
order_date,
MIN(order_date) OVER (PARTITION BY customer_id) AS first_order_date
FROM silver.orders;
The SQL version ignores dashboard filters entirely, which matches a FIXED expression when no context filters are set. If the Tableau workbook used context filters, decide which filters should shape the value and build them into the query, because the dashboard cannot reach into a gold table at run time. Please test this example in a Databricks workspace before adapting it.
Recreating Tableau user filters as Unity Catalog row filters and column masks applies the rules to every consumer, not only Tableau. Unity Catalog evaluates them at query time, so no extra warehouse-level enforcement is needed. What matters is the identity the connection carries:
| Connection Style | Whose Scope Applies | Implication |
|---|---|---|
| Per-user OAuth (user-to-machine) | Each viewer's own identity | Row filters apply per person |
| Shared service principal or token | The service principal's identity for everyone | All viewers share one data scope unless per-user delegation exists upstream |
Decide the authentication model first, test each role with real accounts, and document who sees what. Our guides to migrating row-level security and data security compliance cover the design side.
| Tableau Behavior | What Changes on Databricks | Safeguard |
|---|---|---|
| Four ranking functions: RANK, RANK_DENSE, RANK_UNIQUE, and RANK_MODIFIED | SQL has rank(), dense_rank(), and row_number(), with no direct modified-competition equivalent | Map each Tableau function deliberately and compare top-N lists around ties |
| Top N applied before dimension filters | A SQL filter order can return different rows | Rebuild the filter order explicitly, using context filters where needed |
| Date truncation and week start settings | Truncation defaults and week boundaries can differ | Confirm the start-of-week rule and test boundary dates |
| Hyper extract snapshot versus live query | Live queries show current data, while extracts show the last refresh | Align refresh timing during parallel runs |
| Ratios and averages | An average of row-level ratios is not a sum divided by a sum | Compute ratios from totals and check distinct-count logic |
| NULL handling in derived logic | Concatenation, comparisons, and defaults can diverge even when SUM and AVG agree | Test derived fields on rows with NULLs |
These are the differences behind dashboards that look right and quietly are not, and the reason for column-level checks like those in our automated ETL testing with Python approach. Compare record counts, KPIs at total and dimension level, rankings around ties, filter behavior, and load times under realistic concurrency, each with an agreed tolerance and an owner.
| Phase | What Happens | Exit Criterion |
|---|---|---|
| Inventory | Catalog workbooks, data sources, extracts, calculated fields, LOD expressions, parameters, and usage, and retire unused content | A scored inventory, because workbook files are XML and can be read programmatically |
| Logic documentation | Record every calculated field with its definition, owner, and expected output | A signed-off logic catalog |
| Path decision | Choose repoint, import, or rebuild for each subject area | A path per subject area |
| Data build | Land source data unchanged in bronze, and build silver and gold at the grain dashboards need | Gold tables reconciled to sources |
| Logic migration | Move row-level calculations and fixed-grain aggregations into gold tables, views, or metric views | Documented functional equivalents |
| Dashboard step | Repoint workbooks to gold objects, or import them with Genie Code, keeping field names identical where possible | Dashboards loading from the new source |
| Parallel run and validation | Run old and new side by side for at least one full reporting cycle and reconcile | Signed-off parity |
| Cutover and monitoring | Promote through environments, then watch job failures, freshness, and warehouse performance | Stable operations |
Migrate in waves by subject area, and see our key checklist for BI modernization and data warehouse to Databricks article for the wider sequencing. If your Tableau version itself is aging, our note on Tableau's release cycle explains why upgrade planning should run alongside.
Moving Tableau logic onto Databricks is easy to start and hard to finish, because the effort hides in view-dependent calculations, security identity, and the numbers that must still match. DataTerrain brings 17+ years and 400+ clients in BI and data modernization, with automated discovery of workbook logic, conversion support, and figure-for-figure validation. Start with our Reports Conversion service or the wider Databricks migration services page.
Databricks Migration Services | ETL Migration to Databricks | Tableau to Power BI Migration | Tableau to Microsoft Fabric Migration | Tableau to Amazon QuickSight | MicroStrategy vs Power BI vs Tableau | Enterprise BI Migration Services | Reports Conversion Services | BI Reports and Dashboard Development | Tableau's Release Cycle | Oracle to Databricks Migration | SQL Server and SSIS to Databricks | Teradata to Databricks Migration | Alteryx to Databricks Migration | Data Warehouse to Databricks | Legacy Systems to Databricks