Start here →
DATA step and macros parsed structurally. Emitted as Spark notebooks on Azure with ADLS and Delta. Fabric or ADF replaces SAS Grid.
Deterministic parsers read the SAS estate and emit native Azure code — not SAS installed on an Azure VM.
SAS programs → SAS2PY parser → Spark + ADLS + Fabric
SAS2PY Parser
Deterministic parse
AI optional
Pipeline emit
ADF / Fabric
Azure
ADLS Gen2
Delta Lake
Fabric / ADF
Replaces SAS Grid
Unity Catalog
When on Databricks
AI is an optional add-on, off by default — the conversion runs end to end without it, air-gapped if your estate requires it.
Lift-and-shift keeps the license and the overnight window. We emit native Spark that ADLS and Fabric already know how to run.
Lineage from the parse lands in Purview or Fabric — not a comment in a .sas file.
Azure Data Factory or Fabric pipelines replace the scheduler.
A DATA step running total with FIRST. reset — emitted as PySpark that runs on Azure Databricks or Fabric Spark.
/* SAS */ data gold; set txn; by cust_id; if first.cust_id then tot = 0; tot + amount; run;
# BY-group → Spark window
from pyspark.sql import functions as F
from pyspark.sql.window import Window
w = Window.partitionBy("cust_id").orderBy("txn_date")
gold = txn.withColumn("tot", F.sum("amount").over(w))
FIRST. and RETAIN become a window. Storage is ADLS, not a SAS library.
| SAS | Azure | Notes |
|---|---|---|
| DATA step | PySpark / Spark SQL | Azure Databricks or Fabric |
| PROC SQL | Spark SQL | Lakehouse tables |
| SAS dataset | ADLS + Delta | ACID on the lake |
| SAS Grid | ADF / Fabric pipeline | Scheduler replacement |
| Macro | Expanded then emitted | No leftover SAS |
SAS output compared to Azure output — row by row, column by column. Differences flagged before sign-off.
See how Data Matching works →One Iceberg spec across AWS, Azure, and GCP. Azure HQ jobs landed on ADLS with a Hive Metastore. Same parser, native catalog.
Read the case study →