# Computed File vs Computed Table

Source: https://userguide.qualytics.io/container/computed-files/deep-dive/computed-file-vs-computed-table/

You reached this page from the Computed Files sub-tree. If you already know your raw data lives in files on object storage, keep reading; if the source is a JDBC warehouse instead, jump to [Computed Table vs Computed File](https://userguide.qualytics.io/container/computed-tables/deep-dive/computed-table-vs-computed-file/).

## When a Computed File fits

A Computed File is the right choice when:

- The source data lives in **files on object storage** (Amazon S3, Google Cloud Storage, Azure Data Lake Storage).
- The files are Parquet, ORC, Avro, CSV, TSV, PSV, JSON, Excel, Delta, or Iceberg.
- You want to normalize columns, cast types, or flatten nested arrays (via lateral views + `EXPLODE`) using Spark SQL.
- You want the transformation cost to scale with your DFS storage layout (partition-aware, columnar-format aware).
- You are OK with a single-source restriction: one `source_container_id` per Computed File.

## When a Computed Table fits instead

Switch to a [Computed Table](https://userguide.qualytics.io/container/computed-tables/deep-dive/introduction/) if:

- The source data lives in a **JDBC warehouse** (Snowflake, PostgreSQL, Redshift, SQL Server, Oracle, BigQuery, Databricks, and similar), or in a **native datastore** (AWS Glue Native, Hive Native, MongoDB, Unity Catalog Native).
- On a JDBC warehouse, you want to reuse the **warehouse's own SQL dialect** and its query planner, with the query pushed down to the warehouse instead of evaluated by Qualytics's Dataplane. On a native datastore the query is Spark SQL and runs in the Dataplane, as a Computed File does.
- The transformation needs **joins across multiple base tables or views** in the same datastore.

## Side-by-side comparison

| Feature | Computed File (DFS) | Computed Table (JDBC or native) |
| --- | --- | --- |
| Source datastore | DFS (S3, GCS, Azure Data Lake Storage) | JDBC warehouse or native datastore |
| Query language | Spark SQL | Warehouse's own SQL dialect on JDBC, Spark SQL on native |
| Number of source containers | One `source_container_id` | Any base tables and views in the datastore |
| Joins inside the container | No, use a [Computed Join](https://userguide.qualytics.io/container/computed-join/getting-started/) | Yes, across base tables of the same datastore |
| Source pre-profile required | Yes, at least once | No |
| `DISTINCT` in the projection | Not allowed, use `GROUP BY` | Allowed if the warehouse allows it |
| Fully-qualified name requirement | Not applicable | SQL Server, Oracle, Redshift |
| Execution runtime | Qualytics's Dataplane | Warehouse engine on JDBC, Qualytics's Dataplane on native |
| Materialized on storage | No (metadata-only definition run on demand) | No (metadata-only definition run on demand) |

*Last updated: November 9, 2026.*
