Skip to content

feat: partition_by option for Hive-partitioned Parquet output#21

Merged
cigrainger merged 2 commits into
mainfrom
cg/partition-aligned-writes
Mar 24, 2026
Merged

feat: partition_by option for Hive-partitioned Parquet output#21
cigrainger merged 2 commits into
mainfrom
cg/partition-aligned-writes

Conversation

@cigrainger

Copy link
Copy Markdown
Contributor

Summary

Add partition_by: option to to_parquet/3 for Hive-style partitioned directory output. Works both single-node and distributed.

Usage

# Single-node
Dux.from_parquet("events.parquet")
|> Dux.to_parquet("/output/events/", partition_by: [:year, :month])
# Creates: /output/events/year=2024/month=01/data_0.parquet

# Distributed — each worker writes to the same Hive directories
Dux.from_parquet("s3://input/**/*.parquet")
|> Dux.distribute(workers)
|> Dux.to_parquet("/output/events/", partition_by: :region)
# Creates: /output/events/region=US/w0_0.parquet, region=US/w1_0.parquet, etc.

Details

  • Single-node: appends PARTITION_BY ("col") to DuckDB COPY options
  • Distributed: uses FILENAME_PATTERN "w{idx}_{i}" per worker to prevent file name collisions when multiple workers write to overlapping partition directories
  • Column names are properly quoted (handles reserved words like group)
  • Supports single column (atom/string) or list of columns
  • Combines with :compression and other COPY options

Test plan

  • Single partition column creates Hive directory structure
  • Multiple partition columns create nested directories
  • partition_by with compression option
  • Round-trip: partition_by write then partition-pruned read
  • Distributed: each worker writes Hive-partitioned output, correct totals
  • 600 non-distributed tests pass, Credo clean
  • 6 distributed write peer tests pass

🤖 Generated with Claude Code

cigrainger and others added 2 commits March 24, 2026 12:19
Add partition_by: option to to_parquet for Hive-style directory output
(year=2024/month=01/data_0.parquet). Works single-node and distributed.

Distributed partition_by uses FILENAME_PATTERN per worker to avoid
file name collisions when multiple workers write to the same
partition directories.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add property-based round-trip test, adversarial (nulls, special chars,
reserved words), scale (1000 rows / 50 partitions), empty result,
string column names. Add peer tests for local-vs-distributed
equivalence and 3-worker scale.

Fix distributed partition_by race condition: each worker now writes to
its own subdirectory (__w0/, __w1/) to avoid concurrent directory
creation collisions. Auto-create output directory for local paths.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@cigrainger
cigrainger merged commit 87af936 into main Mar 24, 2026
5 checks passed
@cigrainger
cigrainger deleted the cg/partition-aligned-writes branch March 24, 2026 01:44
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