AEO

How Can BI and ML Share One Copy? One-Copy BI and ML Architecture

Sep 16, 202612 min readDevikrishna RDevikrishna R
How Can BI and ML Share One Copy? One-Copy BI and ML Architecture

TL;DR

We show Azure data teams how a one-copy BI and ML architecture keeps object storage, open table metadata, catalogs, and separate compute in sync without a forced migration. We compare Delta Lake, Iceberg, and Hudi, explain snapshot-safe reads and writes, and provide a phased consolidation and operations checklist.

How Can BI and ML Share One Copy? One-Copy BI and ML Architecture

Analytics teams often mistake a unified platform for a shared cluster. In Fabric, one capacity unit maps to two Spark vCores, which reinforces the useful distinction: compute can be separate while the underlying data remains shared.

A one-copy BI and ML architecture lets BI, batch processing, streaming, and machine learning use the same governed physical data by combining object storage, Parquet, a transactional table format, and a catalog. SQL, Spark, and Python workloads resolve consistent snapshots instead of receiving exported copies, while compute scales independently.

We explain the storage layers that make this possible, compare the main open table formats, show how concurrent readers and writers stay safe, and lay out a gradual Azure migration path that preserves existing tools.

How Does a One-Copy BI and ML Architecture Work?

The phrase “one copy” needs a practical definition. We mean one canonical physical set of data files for a source-of-truth table, with governed metadata that tells each engine which files form the current table. We do not mean that every workload must share a cluster, a notebook runtime, or a single presentation model.

Object storage holds the files, Parquet organizes them for analytical scans, and the table format adds the database-like contract that raw folders lack. A catalog then supplies table discovery, permissions, ownership, lineage, and the path that readers should resolve. ADLS Gen2 adds file system semantics at object-storage scale, making it a useful foundation for this design.

Layered one-copy data architecture for Azure analytics

Separate Storage from Compute

We keep compute specialized because BI queries, scheduled transformations, streaming jobs, and model training have different concurrency, memory, and accelerator needs. The storage layer becomes the durable meeting point, while each workload uses an engine appropriate to its work.

That separation prevents a familiar failure mode: a team exporting curated data simply because its preferred engine cannot trust or discover the engineering team’s latest files. A one governed lakehouse gives teams a shared contract without asking them to abandon every existing tool on day one.

Use Metadata to Define the Table

Parquet alone is a file format, not a transaction boundary. Open table formats add metadata for schemas, file lists, statistics, snapshots, and commits. A table-aware reader resolves that metadata first, then reads only the files belonging to the committed version it selected.

This is why pointing several tools at a folder is not enough. A generic file scan can miss schema changes, include obsolete files, or bypass row-level changes represented in metadata. The table format is the layer that turns shared files into a reliable shared table.

Keep BI Logic Separate from Data Copies

A BI semantic model should define measures, relationships, hierarchies, and business-friendly names. It should not require a second raw extract just to become useful. Direct Lake can read Delta tables from OneLake without importing data, which is central when freshness matters.

The same principle applies to ML. Feature tables, training sets, model outputs, and predictions can be separate governed tables with clear owners. They coexist with source tables, rather than overwriting them or quietly creating untracked file copies.

Which Open Table Format Fits Shared BI and ML Workloads?

No table format wins every workload. We choose based on existing engines, mutation patterns, catalog support, BI access requirements, and whether the team can operate maintenance tasks such as compaction and retention.

The matrix below is a design aid, not a benchmark. It helps Azure teams match format behavior to the way their pipelines actually write and read data.

FormatStrong FitMutation PatternCommon Engine AccessMetadata And Governance Considerations
Delta LakeAzure and Fabric-oriented shared analyticsTransactions, merges, deletes, batch, and streamingSpark, SQL, Flink, Trino, Hive, Python connectorsTransaction log, schema enforcement, time travel, strong Direct Lake path
Apache IcebergBroad multi-engine analyticsAtomic commits, schema evolution, partition evolutionSpark, Trino, PrestoDB, Flink, Hive, ImpalaSnapshot and manifest metadata, catalog-centered interoperability
Apache HudiIncremental ingestion and frequent upsertsUpserts, deletes, CDC, compaction, clusteringSpark, Flink, Trino, Presto, Hive, Python pathsTimeline, indexes, table services, more operational ownership

When Delta Lake Is the Practical Default

Delta Lake combines Parquet files with a transaction log, enabling ACID behavior, schema enforcement, time travel, and batch plus streaming access. In Fabric, Delta is the standard table format across workloads, so it is often the lowest-friction choice when BI semantic models, Spark, and SQL must operate on the same data.

The important decision is not merely that Delta supports a feature. It is whether every intended reader uses a supported connector and honors the table log. We use the documented Delta capabilities to validate that path before standardizing.

When Apache Iceberg Improves Engine Portability

Iceberg is designed for large analytical tables that must work across many engines. Its documentation describes production tables reaching tens of petabytes and billions of files, while readers use snapshots, manifests, and metadata rather than expensive directory listings.

For teams with a wide engine estate, its schema and partition evolution can reduce pressure to rewrite tables for each new consumer. We treat Iceberg documentation as the source of truth for a particular engine and catalog combination, rather than assuming compatibility from a logo list.

When Apache Hudi Suits Incremental Writes

Hudi is especially relevant when continual incremental updates, change data capture, and efficient upserts are core requirements. Its timeline, indexes, compaction, and clustering services help it manage mutable data lake tables while preserving open file storage.

That capability comes with operational responsibility. Teams must own table services and retention decisions, not assume that write-heavy tables maintain themselves. Hudi’s storage architecture also supports snapshot isolation, which matters when streaming writers and analytical readers overlap.

How Python and ML Readers Fit

Python tools can access shared tables through table-aware connectors or through a resolved, versioned file set. Ray, for example, can read Parquet in Azure storage through an Arrow-compatible filesystem, but we still ensure the path reflects the table snapshot rather than a raw directory scan.

That distinction protects reproducibility. A training job should record the selected table version, feature-table version, code version, and model artifact. Our unified SQL, Spark, and ML architecture approach treats those details as part of the data contract, not as optional notebook notes.

How Do Shared Table Snapshots Protect Readers and Writers?

A shared table remains trustworthy only if readers never see half a write and writers cannot silently corrupt one another’s changes. Open table formats solve this by making the commit metadata, not a folder listing, the authoritative definition of a table state.

A typical write first creates new data files, validates the intended change, checks the current table version, and atomically publishes a new snapshot. Existing queries continue reading the snapshot they started with. New queries resolve the newer committed snapshot. Delta concurrency uses optimistic concurrency control to make this possible.

That same versioning contract supports shared BI performance, because a dashboard can resolve a stable table state while scheduled transformations update a later snapshot.

Write Data Before Publishing Metadata

A writer does not replace a table by overwriting every file in place. It prepares new files and then publishes a metadata change that points readers to the new state. If validation or conflict detection fails, the new state is not committed as the table’s current version.

This pattern is why table-aware writes matter. A direct Parquet write into a managed table path can leave files that no valid snapshot references, or worse, create ambiguity about which data is current.

Give Every Reader a Stable Version

Snapshot isolation means a dashboard can finish a query against one consistent state even while a batch job updates the table. Training jobs gain the same benefit because they can reproduce a run from a recorded table version instead of relying on whatever files happen to be present later.

Time travel is useful for recovery and audit, but it is not free storage. The retention setting must match the longest required reader, model-reproduction, and rollback window.

Separate Source Tables from Derived Assets

We keep bronze and silver source-of-truth tables distinct from feature tables, gold serving tables, model outputs, and BI semantic models. A model prediction table can evolve quickly without changing the customer or transaction table that produced it.

This boundary also makes ownership clearer. Data engineering owns canonical ingestion and curation, ML teams own feature and prediction outputs, and BI teams own semantic logic. Shared storage does not mean shared write access.

Schedule Maintenance Without Breaking Readers

Compaction reduces small-file overhead, while retention removes old files that are no longer referenced by active snapshots. Hudi similarly distinguishes writers, readers, and table services, with snapshot isolation across those operations.

We schedule these tasks as production work. File health, commit failure rate, stale snapshots, and long-running readers deserve the same monitoring discipline as pipeline failures.

How Can Azure Teams Consolidate Without Replacing Everything?

Consolidation succeeds when it starts with the storage and metadata layers, then moves one producer or consumer at a time. We apply legacy ETL modernization principles so teams do not replace a functioning dashboard, ETL process, or ML environment before the shared table contract has proven itself.

The phased plan below keeps existing consumption tools live while it removes avoidable copies. Each phase has a clear exit condition, which helps teams avoid permanent dual writes and migrations that never finish.

PhaseKeep RunningAdd Or ChangeExit Evidence
Map And GovernExisting BI, pipelines, and training jobsPhysical-path inventory, owners, contracts, duplicate-data baselineEach priority table has an owner and canonical path
Establish Canonical TablesCurrent dashboards and scheduled jobsOpen-table storage, catalog registration, reference pathsSQL and Spark read the same governed table
Migrate And ValidateLegacy BI remains liveTable-aware writes, quality checks, snapshot parity testsFreshness, row counts, and critical metrics meet agreed targets
Switch And RetireValidated legacy toolsDirect table connections and controlled decommissioningOld copies are read-only, then removed after the rollback window

We start by measuring copies instead of arguing about platforms. For every priority dataset, document storage paths, refresh schedules, readers, owners, sensitive fields, and downstream dependencies. That inventory exposes whether a duplicate exists for a genuine latency or access requirement, or only because teams lack a trusted shared interface.

Next, we register canonical tables and preserve established paths where appropriate. OneLake shortcuts can reference existing data without copying it. We migrate writes carefully, validate outputs against existing reports, then move consumers by service-level agreement rather than organizational preference.

The final step is retirement, not endless coexistence. We use a written rollback period, confirm the new reader has equivalent security and freshness behavior, and then make the old copy read-only before removal. A broader tool consolidation plan keeps that work focused on outcomes instead of a disruptive replatforming campaign.

What Keeps One Shared Data Layer Reliable in Production?

One-copy architectures move complexity away from data movement and into disciplined operations. That is a healthy trade if teams explicitly staff table maintenance, access controls, monitoring, and workload scheduling.

We treat readiness as a set of operating controls, not a platform checkbox. The list below is the minimum conversation we expect before production cutover.

  • File Health: Set a target file-size strategy, monitor small-file growth, and schedule compaction after large ingest events. File layout affects SQL, Spark, and BI readers alike.

  • Retention And Recovery: Define time-travel and rollback needs before cleanup. Fabric Delta VACUUM uses a seven-day default, or 168 hours, and a shorter setting can invalidate old snapshots required by readers or recovery work.

  • Access Isolation: Apply catalog permissions, managed identities, Azure RBAC, and directory-level ACLs so readers receive only the data they should see. Shared physical storage is not an argument for shared write permissions.

  • CPU And GPU Scheduling: Keep BI concurrency, batch windows, streaming jobs, and model training in separate capacity plans. We use batch and streaming design decisions to prevent a training run or backfill from becoming a dashboard outage.

  • Monitoring And Cost Attribution: Track table freshness, commit failures, file counts, query latency, capacity pressure, and training utilization by workspace and workload. Fabric’s capacity metrics can expose throttling and consumption patterns that make hidden contention visible.

A shared table does not eliminate every derived asset. Teams may still need approved aggregates, feature tables, caches, backups, or disaster-recovery replicas. The goal is to make every additional copy intentional, named, governed, and removable through Azure lakehouse engineering.

Build a One-Copy Data Practice with Vision Board

At Vision Board, we teach Azure data engineering as a set of connected operating decisions, not as isolated notebook exercises. Our learning paths help working teams trace how storage, table metadata, SQL serving, Spark transformations, security, and ML consumption fit together before they attempt a migration. We focus on the questions that decide whether one-copy designs remain trustworthy in production: who owns a table, which writer can change it, how a semantic model stays fresh, when a snapshot can be deleted, and how teams separate CPU and GPU demand. That makes the architecture easier to explain to stakeholders and safer to test alongside existing pipelines. If your team needs a practical route from scattered exports to governed shared tables, we can help you build the vocabulary, review the design, and practice the migration sequence in realistic Azure scenarios. Start with Vision Board.

FAQs on One-copy BI and ML Architecture

These answers address the implementation questions teams ask after they agree on a shared storage and metadata layer. They also clarify where intentional derived data still belongs.

Can BI and ML Use the Same Delta Table?

Yes. With a table format and catalog exposing one committed snapshot, BI queries and training jobs read the same governed data on separate compute resources.

Do Open Table Formats Eliminate Every Copy of Data?

Not entirely. They remove avoidable canonical-table copies, but approved derived features, aggregates, model outputs, caches, backups, and disaster-recovery replicas can still serve defined operational needs.

Which Format Should We Choose for Shared Workloads?

Choose the format whose supported engines, write pattern, catalog, and maintenance model match your estate. Do not standardize solely from a feature checklist or trial.

Can We Consolidate Without Replacing Our BI Layer?

Yes. Start by naming canonical tables and registering metadata, then migrate one producer or consumer at a time while validation protects existing dashboards and pipelines.

Why Should Python Readers Resolve Table Metadata?

Python consumers should use a connector or resolved snapshot manifest, since reading folders as generic Parquet can bypass transaction metadata and return incorrect table state.

Keep reading

www.visionboardedtech.com.

Empowering professionals with industry-recognized certification programs, expert mentorship, and practical learning to unlock better career opportunities.

© 2026 www.visionboardedtech.com

Powered by PageLens.ai

Start your Azure Data Career Roadmap Now

Join now