Store Compressed and Partitioned in S3
BPE-3 Order: #3 Datalake Formation Has Dependencies
Updated 1 month, 2 weeks ago
Guidance
Purpose
Turn raw landing-zone JSON into Hive-partitioned Parquet in the curated bucket.
Inputs
- Raw Operational Events (S3 Landing Zone).
- CDK Application (
ParquetTransformFnlives in IngestionStack). - Lake Scope Contract paths: raw vs curated.
- Populate-Lake Pipeline (batch transform after backfill).
- Skill S3 Data Partitioning and Compression → Recipe step 2 (event→table map).
Canonical layout (do not invent another)
- Raw:
s3://{raw}/{source}/{yyyy}/{mm}/{dd}/{event-id}.json - Curated:
s3://{curated}/{table}/source={source}/dt={yyyy-mm-dd}/part-{uuid}.parquet {table}is a name from contractviews. Two buckets, always.
Steps
- Open skill S3 Data Partitioning and Compression. Handler path:
infra/lambdas/parquet_transform.py(_normalize_rowomitssource). - Event → table map (skill 64 recipe 2):
push→github_commits,pull_request→github_pull_requests,issues→github_issues,workflow_run→github_workflow_runs; backfillkindcommits/pulls/issues/workflow_runs. Projects v2 →github_project_itemsonly when that poller is real. ParquetTransformFnwrites pyarrow Parquet. Omitsource/dtfrom the row body — they are Hive partitions only.- Webhooks: SQS buffer. Backfill:
scripts/sync_raw_to_curated.pyfrom populate-lake only, not a laptop against shared env. - Lifecycle: hot recent partitions Standard; cold raw/history IA or Glacier.
- Confirm lake buckets have S3 Bucket Keys (
bucket_key_enabled=True) via pytest synth (tests/unit/test_ingestion_stack.py), not the S3 console encryption tab alone. - If
jirais scoped, run Backfill Historical Jira Issues and Status History (sibling of GitHub backfill) before Glue — this activity's predecessor is GitHub backfill only because workflows cannot cross-link both.
Done when
- Curated prefixes exist for every contract
viewsentry that backfill produced. - Glue can crawl without "duplicate columns".
- No EMR/Spark cluster.
- SSE-KMS Bucket Keys are on (new objects do not call KMS per Put/Get).
Feeds
Catalog with AWS Glue.
Details
- Order:
- #3
- Phase:
- Predecessor:
- BPE-2 Backfill Historical GitHub Events
- Successor:
- BPE-4 Catalog with AWS Glue
- Created:
- Aug 31, 2026
- Last Updated:
- Sep 17, 2026
Workflow
Build the Operational Data Lake Pipeline
Pull operational history from the systems people actually work in into the lake, including closed work, so duration and wait …
View WorkflowAssigned Agent
Data Platform Engineer
Agent: Data Platform Engineer Role Owns Datalake Formation: Scope Contract → Python CDK (DeployStack + …
Required Skills
- S3 Data Partitioning and Compression Data Engineering Amazon S3, Apache Parquet
Rules
-
Infrastructure as Code First
infrastructure-as-code-first -
Least-Privilege IAM and Encryption by Default
least-privilege-iam-and-encryption-by-default -
No EMR or Persistent Clusters for Ingestion
no-emr-or-persistent-clusters-for-ingestion -
Parquet Over Raw Formats
parquet-over-raw-formats -
Partition by Source and Date at Minimum
partition-by-source-and-date-at-minimum -
Partition Keys Stay Out of Parquet Body
partition-keys-out-of-parquet-body -
S3 Bucket Keys With SSE-KMS
s3-bucket-keys-with-sse-kms
Input Artifacts 5
-
CDK Application (Infrastructure Stacks)
Document
Required
Produced by: Model the Data Lake as CDK Stacks -
Jira Flow Extract Contract
Document
Produced by: Backfill Historical Jira Issues and Status History -
Lake Scope Contract
Document
Required
Produced by: Scope Sources, Org, and Environment -
Populate-Lake Pipeline
Document
Produced by: Backfill Historical GitHub Events -
Raw Operational Events (S3 Landing Zone)
Document
Required
Produced by: Stand Up Serverless Ingestion from Scoped Sources
Output Artifacts 1
- Partitioned Parquet Data Lake Document Required