Loading Academy Hub...
Switch from legacy CSV files to Snappy-compressed columnar Parquet backed by pyarrow. Achieve 10x-50x faster read/write speeds, predicate pushdown, and column projection.
[!IMPORTANT] Staff Engineer Rule: Never store intermediate production pipeline datasets as
.csvor.json. CSV files lack schema enforcement, have no column statistics, require full scans for single-column queries, and consume 5x-10x more disk space.
| Metric | CSV File | Snappy Parquet | Advantage |
|---|---|---|---|
| Disk Size | 1.8 GB | 280 MB | 6.4x smaller |
| Full Read Time | 22.4 seconds | 1.6 seconds | 14x faster |
| Read Single Column | 22.4 seconds (full scan) | 0.22 seconds (projection) | 100x faster |
| Schema Preservation | Lost (strings inferred) | Strongly typed | Zero schema drift |
df.to_parquet(path, engine="pyarrow", compression="snappy", partition_cols=["event_date"])—ZSTD saves even more S3 storage (~25–35% smaller than Snappy) for archival Silver/Gold layers.dtype_backend="pyarrow" lets Pandas share memory buffers seamlessly with PyArrow, DuckDB, Polars, and PySpark via Arrow IPC/Zero-Copy without expensive Python-to-JVM row deserialization!partition_cols=["user_id"]—creating 100,000 tiny directories will cripple S3 and Athena metadata listing.Review the production code, company interview Q&As, incident traces, and comprehension quiz inside this lesson.
import pandas as pd
# Write partitioned parquet dataset
# pd.DataFrame(...).to_parquet('s3://lakehouse/gold/sales/', partition_cols=['year', 'region'], engine='pyarrow', compression='snappy')
# Column projection: Only load 2 columns out of 50
# Predicate pushdown: Only load rows matching filter at storage engine layer
df_filtered = pd.read_parquet(
'data/sales.parquet',
columns=['order_id', 'amount'],
filters=[
('region', '==', 'US-WEST'),
('amount', '>', 500.0)
],
engine='pyarrow'
)pyarrow.lib.ArrowInvalid: Column 4 named amount expected double but got string