Skip to content

[SPARK-39031][SQL] Match NaN pivot values in PivotFirst - #58234

Draft
jiwen624 wants to merge 1 commit into
apache:masterfrom
jiwen624:SPARK-39031
Draft

[SPARK-39031][SQL] Match NaN pivot values in PivotFirst#58234
jiwen624 wants to merge 1 commit into
apache:masterfrom
jiwen624:SPARK-39031

Conversation

@jiwen624

@jiwen624 jiwen624 commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

What changes were proposed in this pull request?

Route FloatType/DoubleType pivot columns through PivotFirst's TreeMap index instead of the HashMap one, and make the TreeMap ordering null-safe so null remains a usable pivot value.

Why are the changes needed?

groupBy("v").pivot("v").count() on a float/double column returns an all-null column for NaN: Scala's HashMap compares keys with ==, under which NaN != NaN, so the row is dropped. That contradicts Spark's documented NaN semantics ("NaN = NaN returns true", "in aggregations, all NaN values are grouped together"), and pivot's own standard path already returns the right answer, so the PivotFirst fast path silently changes results. The TreeMap's interpreted ordering implements those semantics.

The ordering is made null-safe so null stays usable as a pivot value, as it was on the HashMap path; this also fixes an INTERNAL_ERROR for binary and collated string pivot columns.

Also note: another issue is found during the fix of this one. Raised https://issues.apache.org/jira/browse/SPARK-58959 as a follow-up.

Does this PR introduce any user-facing change?

Yes. Pivoting on a float/double column now matches NaN values instead of producing an all-null column. Pivoting on a column whose values include null no longer fails with INTERNAL_ERROR for binary and collated string columns.

How was this patch tested?

Added UT cases.

Was this patch authored or co-authored using generative AI tooling?

Yes.

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