Hard sources — not covered by free tools
Also parsed — certify what free tools miss
Runtimes
After migration
PowerCenter repository XML parsed structurally. Mappings, workflows, and sessions converted to PySpark notebooks on Databricks with Delta Lake. Full lineage, validated parity.
Deterministic parsers read the estate and emit native Databricks code — not PowerCenter mappings lifted into hosted PowerCenter.
Informatica → MigryX parser → PySpark + Delta + Workflows
Deterministic parseAI where it helpsMigryX AI handles the logic parsers cannot resolve alone, and every change it makes goes through the same parity checks. It runs on a model you approve, air-gapped if your estate requires it.
No security patches after that. No compliance coverage. Databricks is where the data already lives - moving the ETL logic there eliminates the middleware and the license.
PowerCenter's SCD Wizard generates complex staging logic. Delta Lake MERGE INTO does the same thing in one atomic operation with time travel built in. 340 SCD Type 2 mappings converted in the case study below.
Partition counts become executor configs. Commit intervals become checkpoint configs. Connection pools become JDBC properties in Databricks Secrets. MigryX parses all of it from the workflow XML.
The Update Strategy transformation with DD_INSERT/DD_UPDATE/DD_DELETE flags - converted to a single Delta Lake MERGE operation with full ACID guarantees.
-- Update Strategy Transformation
-- Ports: CUST_ID, NAME, ADDR, MODIFIED_DT
-- Strategy Expression:
IIF(ISNULL(LKP_CUST_ID),
DD_INSERT,
IIF(LKP_MODIFIED_DT < MODIFIED_DT,
DD_UPDATE,
DD_REJECT))
-- Target: CUSTOMER_DIM (Oracle)
-- Update Override:
UPDATE CUSTOMER_DIM
SET NAME = :TU.NAME,
ADDR = :TU.ADDR,
MODIFIED_DT = :TU.MODIFIED_DT
WHERE CUST_ID = :TU.CUST_ID
# Update Strategy -> Delta Lake MERGE
from delta.tables import DeltaTable
target = DeltaTable.forName(spark, "customer_dim")
target.alias("tgt").merge(
source_df.alias("src"),
"tgt.cust_id = src.cust_id"
).whenMatchedUpdate(
condition="src.modified_dt > tgt.modified_dt",
set={
"name": "src.name",
"addr": "src.addr",
"modified_dt": "src.modified_dt"
}
).whenNotMatchedInsert(
values={
"cust_id": "src.cust_id",
"name": "src.name",
"addr": "src.addr",
"modified_dt": "src.modified_dt"
}
).execute()
DD_INSERT/DD_UPDATE flags become MERGE conditions. Update override SQL becomes whenMatchedUpdate set clause. ACID guarantees replace PowerCenter's two-phase commit.
| PowerCenter Component | Databricks Equivalent | Notes |
|---|---|---|
| Source Qualifier | spark.read.jdbc() with pushdown | SQL override and filters preserved |
| Expression Transformation | withColumn() / PySpark UDF | 94 built-in functions mapped |
| Aggregator | groupBy().agg() | All aggregate functions supported |
| Joiner | DataFrame.join() | All join types preserved |
| Lookup (connected + unconnected) | Broadcast join / Delta lookup | Dynamic cache → broadcast |
| Router | DataFrame.filter() | Per-group DataFrames |
| Update Strategy | Delta Lake MERGE INTO | DD flags → merge predicates |
| SCD Type 2 | Delta Lake MERGE INTO | Time travel replaces snapshots |
| Mapplet | Python module function | Importable, unit-testable |
| Workflow | Databricks Workflow | Task DAG, failure handling |
| Session config | Job cluster config | Partitions, buffers, timeouts |
| Target (relational) | Delta Lake table | Unity Catalog managed |
Data Matching compares PowerCenter output against Databricks output - row by row, column by column.
See how Data Matching works →28 regulated enterprises, including six global systemically important banks, have modernized with MigryX. Customer names are shared under NDA in a demo, with reference calls on request.
See all engagements →