Skip to content

feat(ingest): iceberg/parquet support, parallel tag scan, openpyxl, tag-contract docs - #4

Merged
JoshuaHarris391 merged 3 commits into
mainfrom
feat/ingest-refresh
Aug 5, 2026
Merged

feat(ingest): iceberg/parquet support, parallel tag scan, openpyxl, tag-contract docs#4
JoshuaHarris391 merged 3 commits into
mainfrom
feat/ingest-refresh

Conversation

@JoshuaHarris391

Copy link
Copy Markdown
Collaborator

Brings the toolkit's ingest helpers up to the reference implementation's final state:

  • ingest_table_to_dataset / ingest_files_to_dataset with table_format (iceberg default | parquet), plus back-compat *_to_parquet_dataset shims (the old names always wrote Iceberg)
  • write_parquet_to_db ported (was missing entirely)
  • Parallel S3 tag scan (max_workers) replacing the serial per-object loop
  • openpyxl>=3.1.0 declared (xlsx ingest failed at runtime, not install)
  • docs/INGEST.md: the S3 ingest=true tag contract written for someone who didn't invent it — silent-skip semantics, IAM needs, tags-lost-on-copy, the provenance columns, and what ingest_row_hash does and doesn't guarantee

These helpers remain optional bring-your-own-ingestion utilities; the supported no-code path is gen3-metadata-templates → bronze.

302 tests pass.

- port write_parquet_to_db into g3dt.utils.athena_utils so ingest can
  append to legacy plain-Parquet Glue tables
- rename ingest_table/files_to_parquet_dataset to ingest_table/files_to_dataset
  with a validated table_format flag (iceberg default, parquet requires
  dataset_root) and keep deprecated delegating aliases for existing callers
- scan S3 object tags concurrently in get_ingest_true_files (max_workers,
  boto connection pool sized to match) since one GetObjectTagging round-trip
  per file was the bottleneck on large buckets
- replace the mutable exclude_fn default argument with None plus an in-body
  default
read_xlsx_robust uses engine="openpyxl" but it was never declared, so
xlsx ingest failed at runtime rather than install time.
Explains the ingest=true opt-in tag, why untagged objects are silently
skipped, the IAM and tag-propagation sharp edges, the ingest_* provenance
columns and row-hash dedup semantics, and the iceberg/parquet
table_format options, with a worked tag-to-Athena example.
@JoshuaHarris391
JoshuaHarris391 merged commit 87eb348 into main Aug 5, 2026
1 check passed
@JoshuaHarris391
JoshuaHarris391 deleted the feat/ingest-refresh branch August 5, 2026 02:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant