Start here →

Convert SAS programs to AWS

DATA step and macros parsed structurally. Emitted as Spark jobs on EMR or Glue, landing on S3. MWAA replaces the SAS scheduler.

Architecture

SAS in. AWS out.

Deterministic parsers read the SAS estate and emit native AWS code — not SAS on an EC2 instance.

SAS programs → SAS2PY parser → Spark + S3 + Glue

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 EMR / Glue
DAG emit MWAA
AWS
Spark jobs EMR or Glue
S3 Iceberg / Delta
Glue catalog Replaces SAS libs
MWAA Replaces SAS Grid
CodePipeline CI/CD
Lambda 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 AWS

S3 is the library. Spark is the engine.

SAS on EC2 is lift-and-shift

The license follows you. The overnight window follows you. We emit Spark that reads S3.

Glue catalogs beat SAS libraries

Parsed schemas become Glue tables. Lineage is a catalog, not a comment.

Grid is an ops team

MWAA or Step Functions take the schedule. The 36-node Grid is gone.

Parser output

SAS library to an S3 table

A SAS libname plus a DATA step filter — emitted as Spark reading a Glue table on S3.

SAS
/* SAS */
libname dw 'sasdata';
data gold;
  set dw.txn;
  if amount > 1000;
run;
SAS2PY
converts
PySpark on AWS
# libname → Glue / S3
gold = (
    spark.table("dw.txn")
         .filter("amount > 1000")
)
gold.write.format("delta").save("s3://lake/gold")

The SAS library is a catalog entry. The filter is a DataFrame predicate.

Coverage

SAS to AWS — artifact mapping

SASAWSNotes
DATA stepPySpark on EMR / GlueSet-based
PROC SQLSpark SQL / AthenaSame joins
SAS datasetS3 + Iceberg / DeltaObject storage
SAS GridMWAA / Step FunctionsScheduler
MacroExpanded then emittedNo leftover SAS
Validation

Every conversion validated to row-level parity

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

See how Data Matching works →
5,100
jobs
4.4M
LOC
$7.4M
saved
16 mo
duration

National Grocer: 5,100 SAS jobs to open PySpark on AWS

Grid and DI Studio jobs rewritten as Apache PySpark on EMR Serverless and Glue. Same S3 prefixes. No Databricks or Snowflake control plane.

Read the case study →