PowerCenter repository XML parsed structurally. Mappings, workflows, and sessions converted to PySpark notebooks on Databricks with Delta Lake. Full lineage, validated parity.
Upload a mapping, get converted code →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. In the case study below, all 127 regulatory pipelines were validated with 12-month backtesting.
See how Data Matching works →1,800 PowerCenter mappings converted to PySpark on Databricks. 340 SCD Type 2 mappings migrated to Delta Lake MERGE with time travel. End-of-day NAV calculation: 3.5 hours down to under 30 minutes. 280 reusable transformations converted to a versioned Python shared library.
Read the full case study →Upload a PowerCenter XML export. Get parsed lineage, PySpark code for Databricks, and a validation report.