Repository navigation
Represent Hive/value partitioning without claiming Partitioning::Hash #23436
Description
Is your feature request related to a problem or challenge?
Follow-up from #23189
File scans for Hive/value-partitioned data currently represent their output partitioning as Partitioning::Hash on the partition columns. This lets the optimizer avoid repartitioning for key-partitioned operators, but the data was
not actually assigned to partitions by DataFusion's hash partitioner.
This makes Partitioning::Hash carry multiple meanings:
- DataFusion hash partitioning with a particular hash implementation / seed
- another hash implementation / seed
- Hive/value-based file grouping by partition column values
- potentially other source-defined key partitioning methods
These partitioning methods can all provide key colocation, but they are not necessarily co-partitioned by partition index. Treating them all as Partitioning::Hash can make later optimizer decisions and dynamic filtering
decisions brittle or incorrect if they rely on partition compatibility.
Describe the solution you'd like
Discuss and design a more precise representation for value-based physical partitioning. Possible directions from the PR discussion include:
- add a new
Partitioning::Value/ValuePartitionedvariant - represent Hive/value partitioning as
Partitioning::Rangewhen values and ordering are available - make the partitioning method explicit, e.g. hash algorithm/seed vs column value grouping
- explore whether
Partitioningshould become extensible for source-defined partitioning methods
The design should distinguish:
- satisfying a
Distribution::KeyPartitionedrequirement, where key colocation may be enough - proving co-partitioning / partition-index compatibility between two inputs, where the exact partitioning method and value-to-partition mapping matter
Describe alternatives you've considered
No response
Additional context
Related issues and PRs:
- Preserve FIle Partitioning #19090
- Remove redundant partitioned_by_file_group file scan field #23099
- Replace / rename HashPartitioned distribution as KeyPartitioned #23236
- Allow
Partitioning::Rangeto satisfyDistribution::KeyPartitionedgenerally #23266 - refactor: remove redundant partitioned_by_file_group file scan field #23189
Relevant review thread:
- refactor: remove redundant partitioned_by_file_group file scan field #23189 (comment)
- refactor: remove redundant partitioned_by_file_group file scan field #23189 (comment)
- refactor: remove redundant partitioned_by_file_group file scan field #23189 (comment)
- refactor: remove redundant partitioned_by_file_group file scan field #23189 (comment)
- refactor: remove redundant partitioned_by_file_group file scan field #23189 (comment)
Activity
gstamatakis95 commentedon Sep 10, 2026
take
jayshrivastava commentedon Oct 15, 2026
@gstamatakis95 Are you still working on this?
jayshrivastava commentedon Oct 15, 2026
Ah I just saw #25279.
That PR implements support for hive partitioning, detecting that files are Hive partitioned and automatically giving the data source a
Rangepartitioning property. That's a reasonable change but I think we should keep this issue open since it's tracking a more generalized problem.Notably Trino supports the following:
p1 = {A, C, E}, p2 = {B, D}, soRangedoesn't apply*caveat - Filters are unioned across partitions within a machine. However, there's still a distinct filter per machine.
I think it would be good to support the above for feature parity with Trino.
jayshrivastava commentedon Oct 16, 2026
What if we added a custom partitioning scheme which stores an identifier which helps check equality?
The only edge case I think can think of is that CASE expressions in dynamic filters won't work because the partitions are only defined by an identifier.
jayshrivastava commentedon Oct 16, 2026
@kosiew @Phoenix500526 @gabotechs @alamb, what do y'all think about the above two comments?
I have some use cases that would benefit from custom partitioning (ie. it doesn't fit into Hash nor Range partitioning) to avoid repartitions during co-partitioned joins and aggregations.
alamb commentedon Oct 16, 2026
Are you suggesting that we add a custom partitioning as part of this PR? Or as a follow on project?
In my mind, maybe it is time to move to a trait based partitioning scheme rahter than an enum (which would naturally allow any arbitrary partitioning scheme to be supported) 🤔
jayshrivastava commentedon Oct 19, 2026
Probably a follow up.
Ack! I think I agree at a high level. I'll keep an eye out for use cases and see if I can find time to look into it.