Skip to content

feat: Add Spark-compatible monthname function to datafusion-spark#21639

Open
JeelRajodiya wants to merge 4 commits intoapache:mainfrom
JeelRajodiya:feat/spark-monthname-function
Open

feat: Add Spark-compatible monthname function to datafusion-spark#21639
JeelRajodiya wants to merge 4 commits intoapache:mainfrom
JeelRajodiya:feat/spark-monthname-function

Conversation

@JeelRajodiya
Copy link
Copy Markdown

Rationale

The datafusion-spark crate is missing the monthname function. Spark's monthname(date) returns the three-letter abbreviated month name (Jan, Feb, ..., Dec) from a date or timestamp — commonly used in Spark SQL workloads.

What changes are included in this PR?

Adds SparkMonthName to datafusion-spark's datetime functions. It uses arrow::compute::date_part(DatePart::Month) to extract the month number and maps it to the abbreviated name. The signature accepts Timestamp types with automatic coercion from Date32/Date64.

Are these changes tested?

Yes — 6 unit tests covering scalar dates, array dates with nulls, null scalars, timestamp microseconds, all 12 months, and return field nullability.

Are there any user-facing changes?

New monthname scalar function available when using datafusion-spark.

@github-actions github-actions bot added the spark label Apr 15, 2026
Implements `monthname(date_or_timestamp)` that returns the three-letter
abbreviated month name (Jan, Feb, ..., Dec) from a date or timestamp,
matching Apache Spark's behavior.
@JeelRajodiya JeelRajodiya force-pushed the feat/spark-monthname-function branch from d13c56b to a4228b9 Compare April 15, 2026 06:32
Comment thread datafusion/spark/src/function/datetime/monthname.rs Outdated
Comment thread datafusion/spark/src/function/datetime/monthname.rs Outdated
Comment thread datafusion/spark/src/function/datetime/monthname.rs Outdated
@github-actions github-actions bot added the sqllogictest SQL Logic Tests (.slt) label Apr 16, 2026
@JeelRajodiya JeelRajodiya force-pushed the feat/spark-monthname-function branch from d32a486 to e066989 Compare April 16, 2026 10:37
Copy link
Copy Markdown
Contributor

@Jefffrey Jefffrey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be good to go once CI is green

@JeelRajodiya
Copy link
Copy Markdown
Author

I've fixed the CI errors

impl SparkMonthName {
pub fn new() -> Self {
Self {
signature: Signature::exact(vec![DataType::Date32], Volatility::Immutable),
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spark supports input types TIMESTAMP, TIMESTAMP_NTZ, DATE. Perhaps DataFusion will coerce the equivalent types, or should explicit support be added here?

Comment on lines +100 to +102
# Error: wrong argument type (string without cast)
statement error Failed to coerce arguments to satisfy a call to 'monthname' function
SELECT monthname('not-a-date');
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think Spark returns NULL in this case if ANSI mode is disabled, which is the default prior to Spark 4.


# Scalar date input
query T
SELECT monthname('2024-03-15'::DATE);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you also add tests with timestamp input to show that the coercion works as expected

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

spark sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants