Start here →

Convert SAS programs to Azure

DATA step and macros parsed structurally. Emitted as Spark notebooks on Azure with ADLS and Delta. Fabric or ADF replaces SAS Grid.

Architecture

SAS in. Azure out.

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

SAS
Base SAS DATA step / macros
DI Studio Jobs + mappings
EG / EM Projects + flows
Viya / CAS CASL + actions
SAS2PY Parser
Deterministic parse AI optional
Row-level parity Before cutover
Spark emit Notebooks
Pipeline emit ADF / Fabric
Azure
Spark notebooks Databricks or Fabric
ADLS Gen2 Delta Lake
Fabric / ADF Replaces SAS Grid
Azure DevOps CI/CD
Unity Catalog When on Databricks
Python jobs Non-SQL remainder

AI is an optional add-on, off by default — the conversion runs end to end without it, air-gapped if your estate requires it.

Why Azure

The lake should run the job

A SAS box in Azure is still a SAS box

Lift-and-shift keeps the license and the overnight window. We emit native Spark that ADLS and Fabric already know how to run.

No catalog by accident

Lineage from the parse lands in Purview or Fabric — not a comment in a .sas file.

Windows SAS Grid is a standing ops cost

Azure Data Factory or Fabric pipelines replace the scheduler.

Parser output

SAS BY-group to a Spark window

A DATA step running total with FIRST. reset — emitted as PySpark that runs on Azure Databricks or Fabric Spark.

SAS
/* SAS */
data gold;
  set txn;
  by cust_id;
  if first.cust_id then tot = 0;
  tot + amount;
run;
SAS2PY
converts
PySpark on Azure
# 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.

Coverage

SAS to Azure — artifact mapping

SASAzureNotes
DATA stepPySpark / Spark SQLAzure Databricks or Fabric
PROC SQLSpark SQLLakehouse tables
SAS datasetADLS + DeltaACID on the lake
SAS GridADF / Fabric pipelineScheduler replacement
MacroExpanded then emittedNo leftover SAS
Validation

Every conversion validated to row-level parity

SAS output compared to Azure output — row by row, column by column. Differences flagged before sign-off.

See how Data Matching works →
6,400
jobs
5.4M
LOC
$9.2M
saved
3
clouds

Manufacturer: SAS Grids to Iceberg, including Azure

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 →