Data mapping tools: how to pick between ELT platforms, visual mappers, and code-first libraries

Compare managed ELT platforms, visual mapping workbenches, and code-first libraries for data mapping, with pricing and drift handling.

Data Mapping Tools

Most "best data mapping tools" lists put a warehouse replication service, a drag-and-drop XML mapper, and an enterprise ETL suite in the same ranking. Those tools do different jobs. This guide splits them into three groups, shows what each vendor's own docs say about column selection, type handling, and schema changes, and ends with a short test plan you can run before you sign a contract.

What is a data mapping tool?

A data mapping tool connects a field in a source system to a field in a target system and records the rules for converting one into the other. Informatica defines data mapping as "the process of connecting a data field from one source to a data field in another source."

The output is a set of pairs plus rules. A pair says "source column customer_email goes to target column email." A rule says how the value changes on the way: cast a text field to a date, split a full name into two columns, mask a tax ID, or fill a missing value.

In warehouse loading, the same term covers a bigger job. The tool reads the source schema (tables, columns, types), creates matching tables in BigQuery or Snowflake, and keeps them in step as the source changes. Informatica calls that schema mapping: matching the source schema to the target schema.

What are the different types of data mapping?

There are three levels of data mapping: schema mapping (which tables and columns exist on each side), field mapping (which source column feeds which target column), and value or type mapping (how each value gets converted). Each level can be done by hand or by software.

Level

Question it answers

Example

Schema mapping

Which tables and columns exist in the destination?

Postgres table orders becomes BigQuery table raw.orders with the same columns

Field mapping

Which source column feeds which target column?

created_at in the source feeds order_date in the target

Value or type mapping

How does each value get converted?

A Postgres numeric(12,2) lands as BigQuery NUMERIC, a text "2024-01-05" becomes a DATE

Manual mapping means a person defines each relationship. Automated mapping means software reads the source schema and builds the destination schema from it, with no per-field work. Most modern products mix the two: the tool reads the schema and proposes the pairs, and a person overrides the ones that need it.

What are the three kinds of data mapping tools?

Data mapping tools fall into three groups: managed ELT platforms that copy source schemas into a warehouse, visual mapping workbenches for field-by-field rules across formats, and code-first libraries that let you set schema rules in Python. The right group depends on whether your job is replication, format conversion, or custom control.

Managed ELT platforms (Erathos, Airbyte, Fivetran, Matillion, Estuary, Weld, Kondado, Nekt) do schema mapping automatically. You pick tables and columns, the tool creates the destination tables and loads rows. Field renames and business rules happen after the load, in dbt or SQL. Fivetran's own guide says its connector "does not have a mapping editor; transformations happen later, often in dbt or another SQL layer."

Visual mapping workbenches (Altova MapForce, CloverDX, Boomi, Pentaho) are built for field mapping. You draw a line from a source field to a target field and attach functions, filters, and lookups. MapForce maps XML, JSON, databases, PDF, flat files, Excel, EDI, and Protobuf, and an optional AI feature proposes field connections you accept or decline one by one.

Code-first libraries (dlt) generate the destination schema from the data itself and let you set rules in code. dlt evolves the destination schema "by following the structure and data types of the extracted data," and its schema contracts let you freeze tables, columns, or data types.

Which data mapping tools should you compare?

The table below lists what each vendor's own docs and pricing pages say. A cell that reads "not in public docs" means the vendor's fetched pages don't say, so you test it in a proof of concept.

Tool

Group

Mapping controls in the docs

Public pricing

Deployment

Erathos

Managed ELT

Per-job column selection, column anonymization, automatic table creation and schema management, schema drift detection with alerts

Free up to 1M rows/month; US$29/month for 2M rows; US$250/month for 5M rows plus CDC

SaaS

Airbyte

Managed ELT (open source core)

Column selection, schema change propagation with four policies, backfill of new or renamed columns, custom mappings on Pro

Volume-based on Standard, capacity-based (Data Workers) on Pro; dollar amounts not on the page

Cloud, self-managed, on-prem or hybrid on Enterprise Flex

Fivetran

Managed ELT

Automatic type mapping by default, type locking, per-column custom type mapping (Private Preview), data blocking, column hashing, one row filter per table

Not in the fetched docs

SaaS

Matillion

Managed ELT / transformation

CDC schema drift handling for new, deleted, and type-changed columns

Not in the fetched docs

Not in the fetched docs

Estuary

Managed ELT (real-time)

Schema evolutions with a configurable action on incompatible changes (backfill, disable binding, disable task, abort)

Not in the fetched docs

Not in the fetched docs

Weld

Managed ELT

Include or exclude tables and columns, hash or remove columns, protected tables for schema changes

Not in the fetched docs

Not in the fetched docs

Kondado

Managed ELT (Brazil)

Destination list includes PostgreSQL, Redshift, BigQuery, MySQL, SQL Server, Google Sheets, Excel; sync every 5 minutes to weekly

R$99/month for 4 integrations and 1M records/month; 14-day trial

SaaS

Nekt

Managed ELT

SQL transformations and notebooks after load; log-based CDC and SCD Type 2 on Growth

Free with 40 runs/month; Starter from US$149/month; Growth from US$499/month

SaaS; Growth can run inside your AWS or GCP

dlt

Code-first library

Schema inference, type coercion or variant columns, schema contracts (evolve, freeze, discard_row, discard_value), nested JSON flattening

Not in the fetched docs

Runs wherever your Python runs

Altova MapForce

Visual mapper

Graphical any-to-any field mapping, functions, filters, autoconnect same-name fields, AI-suggested connections

Basic from US$349, Professional from US$679, Enterprise from US$1,099 (billing period not on the page)

Desktop software; not open source

CloverDX

Visual mapper / ETL

Visual and code mapping, Excel-template mappings turned into workflows, validation, anonymization

From US$42,000/year

Your servers, Docker, AWS, GCP, or Azure; no SaaS plan

Boomi

iPaaS

"Mapping and transformation" listed as a standard Integration feature; version control; Python and CI/CD on Professional

Pay-as-you-go US$99/month plus usage; 30-day free trial

Not in the fetched pricing page

Pentaho Data Integration

Visual ETL

Drag-and-drop browser interface, plugins for nested data and streaming

Not on the product page

On premises or cloud (Azure, AWS, GCP), Docker and Kubernetes

Two things stand out. First, price models differ by group. ELT platforms charge by rows or runs, visual mappers charge per seat or per server core, and CloverDX starts at US$42,000 a year where Erathos starts at US$0. Second, Fivetran is the only ELT vendor in this list whose docs describe per-column type control, and that feature is still in Private Preview.

How do data mapping tools handle source-to-destination types?

ELT platforms map source types to destination types automatically, and only some let you override the result per column. Code-first libraries coerce values or split mismatches into separate columns. The cases that break in practice are decimals, timestamps, and nested JSON.

Fivetran maps source types to destination types by default. Type locking freezes the destination type of a column, so a changed incoming type gets converted to the locked type instead of changing the table. Custom data type mapping adds a per-column target-type override.

dlt takes the other route. Its default normalizer coerces across compatible types, so a text "123" becomes an integer where the column is an integer. When a value can't be coerced, dlt writes it to a variant column such as id__v_text instead of failing the load. A second normalizer turns coercion off, so every mismatch becomes a variant column and the original value is kept as received.

Decimals are the first thing to test. BigQuery's NUMERIC type has precision 38 and scale 9, FLOAT64 is an approximation, and inserting 1.125 into a NUMERIC(5, 2) column stores 1.13. Snowflake says some conversions lose information: FLOAT to INTEGER drops the fraction and rounds. dlt adds that a Python float like 34.7 passed to a decimal column is converted through a string first, which is convenient but "not mathematically precise." Money should leave the source as a decimal or a string, never a float.

Timestamps are the second. BigQuery's TIMESTAMP is an absolute point in time and DATETIME has no time zone. dlt normalizes timestamps to timezone-aware UTC and treats naive timestamps as UTC, because BigQuery doesn't accept naive timestamps. A source that stores local time without a zone will shift by the offset unless the tool or your dbt model corrects it.

Nested JSON is the third. dlt's default normalizer flattens nested data into child tables, converts identifiers to snake_case (CamelCase becomes camel_case), and shortens names that exceed the destination's limit. BigQuery can also hold nested data as JSON, ARRAY, or STRUCT columns. Which one you get depends on the tool, so check it with a real nested record.

What happens when a source schema changes?

When a source adds, removes, or retypes a column, each tool applies a default policy, and the defaults differ: Airbyte creates new columns and keeps removed ones as NULL, Matillion renames a retyped column and starts a fresh one, Estuary backfills, Weld falls back to a full sync, and dlt evolves the schema unless a contract says freeze. The policy matters more than any feature list.

Tool

New column

Removed column

Type change

Key or cursor removed

Airbyte

Created in the destination; only updated rows get values unless "Backfill new or renamed columns" is on, which re-syncs the whole stream

Column and history kept; new rows get NULL

Can cause row errors; needs a schema or stream refresh

Connection paused for manual review

Matillion CDC

Picked up when non-empty

Kept at target, no longer loaded, NULL from then on

Old column renamed with a datetime suffix; new column of the new type starts NULL

Not in the fetched page

Estuary

Handled by schema evolution with AutoDiscover

Handled by schema evolution

On incompatible change: backfill (default), disableBinding, disableTask, or abort

Key changes can create a new collection with a _v2 suffix

Weld

Tables and columns can be added after setup

Columns can be removed after setup

Unprotected table: automatic full sync, which can lose data the source no longer keeps. Protected table: notification and manual full sync

Not in the fetched page

dlt

Appended (evolve mode) or blocked (freeze)

Kept

Coerced when possible, else a variant column; contracts can discard the row or value

Not in the fetched page

Fivetran

Handled by schema migration

Handled by schema migration

Locked type wins when type locking is on

Primary-key changes are part of schema migration

Erathos

Schema drift detection with alerts

Schema drift detection with alerts

Schema drift detection with alerts

Not in the fetched docs

Airbyte also lets you choose how much of this happens on its own: propagate field changes only, propagate all field and stream changes, approve all changes myself, or stop future syncs. Whatever you pick, a removed cursor or primary key pauses the connection. Cloud checks the source schema before each sync at most every 15 minutes; self-managed checks at most every 24 hours, so a change can wait a day.

Two costs hide in these tables. Automatic backfills re-read whole streams, and Airbyte notes they "may incur increased destination costs." Weld's automatic full sync on an unprotected table can lose rows the source has since deleted. Pick a tool whose default matches what you would do by hand, then confirm it in a test.

What should you test in a data mapping tool proof of concept?

Bring one small source with a known set of awkward columns, load it into the real destination with each candidate tool, and check the resulting tables. The whole test fits in an afternoon per tool and answers more than any feature matrix.

The source table should include:

  • A decimal column holding a currency value with two decimal places.
  • A timestamp column stored in local time without a zone.
  • A JSON column with at least one nested object and one array.
  • A column containing personal data you must hide (an email or tax ID).
  • A primary key and a date cursor you can drop later.

Then run the sync, and after it succeeds, change the source and sync again:

  1. Add a column. Does it appear? Do old rows get values, and did the tool re-read the whole table to fill them?
  2. Rename a column. Is it treated as a drop plus an add, and what happens to history?
  3. Change an integer column to text. Does the load fail, coerce, or create a second column?
  4. Drop the cursor. Does the tool pause, error, or keep running with stale data?

For each result, write down four things: the destination type of every column, the row count in the destination against the source, whether the personal-data column is hashed or removed, and what the tool told you. A tool that changed the table without an alert is a tool you'll debug at 2 a.m.

Where Erathos fits

Erathos is a managed ELT platform that handles schema mapping into a warehouse and leaves field renames and business rules to dbt. It fits the first group in this guide: recurring replication of database and API sources into BigQuery, ClickHouse, Databricks, Redshift, Postgres, SQL Server, or Supabase, from a catalog of 139 connectors.

The mapping controls you get per job are column selection (all columns or a chosen subset) and column anonymization for sensitive fields, both set in the job's column modal. On the destination side, Erathos creates the tables and manages the schema in the BigQuery dataset you choose, and BigQuery pipelines run incrementally by default.

Data moves in three steps. Erathos extracts from the source, writes the batch to a temporary bucket inside its own infrastructure, loads it into the warehouse with COPY or the destination's equivalent, and deletes the temporary files.

Every maintained connector includes schema drift detection and alerts plus automatic retries. For sync behavior you choose among full refresh, partial refresh, partial overwrite, partial append, and partial versioned. Partial modes need a primary key and a date or datetime cursor on database sources; for API sources Erathos picks the cursor itself. Postgres and MySQL also support CDC, with an initial snapshot or WAL-only mode.

For the transformation step, Control fires a webhook or API call when a sync completes, so a dbt Cloud job or an Airflow or Dagster DAG picks up the raw tables. The same page covers retry policies per connection or per job, cursor-based backfill of a date range, and soft-delete detection by comparing against the source without a full reload.

Pricing is by rows written to the warehouse, with no limit on connectors or jobs above the free tier. Freemium is US$0 for 1M rows a month, 1 user, 5 jobs, and daily updates. Movement is US$29 for 2M rows, 3 users, unlimited jobs, and hourly updates. Pro is US$250 for 5M rows, 5 users, CDC, Custom Connector, custom backfill, and updates every 5 minutes.

Try it on your own schema

The proof-of-concept list above takes one source table and an afternoon. Try Erathos free for 14 days, connect a Postgres or MySQL database or one of the API connectors, pick your columns, and watch what lands in your warehouse.