You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by gu...@apache.org on 2026/08/29 22:24:11 UTC
(spark-connect-rust) branch branch-4.2 updated: [SPARK-59116][FOLLOWUP] Default lag/lead offset to 1 for the bare single-column form
This is an automated email from the ASF dual-hosted git repository.
HyukjinKwon pushed a commit to branch branch-4.2
in repository https://gitbox.apache.org/repos/asf/spark-connect-rust.git
The following commit(s) were added to refs/heads/branch-4.2 by this push:
new f77df70 [SPARK-59116][FOLLOWUP] Default lag/lead offset to 1 for the bare single-column form
f77df70 is described below
commit f77df70e33e53c3360d0f32489aa3f60d9df44a5
Author: Hyukjin Kwon <hy...@databricks.com>
AuthorDate: Sun Aug 30 07:24:01 2026 +0900
[SPARK-59116][FOLLOWUP] Default lag/lead offset to 1 for the bare single-column form
Making functions::lag/lead variadic (for the offset/default params) dropped the
default offset that PySpark's lag(col)/lead(col) emit (lag(col, 1)), so the
single-column form no longer matched tests/golden/functions.jsonl -> the "Rust
build and test" / "WASM UDF feature" CI jobs failed the functions_golden case
(cargo build --all-targets compiled it, but cargo test runs the assertion).
Append lit_int(1) only when a single column is passed; callers that supply
offset/default (the Python wrapper) already include them, so the multi-arg path
is unchanged.
cargo test (default and --features wasm-udf) pass; behavioral batteries remain
32/32 + 83/83 + 56/56.
Co-authored-by: Isaac <no...@databricks.com>
---
crates/spark-connect/src/functions.rs | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/crates/spark-connect/src/functions.rs b/crates/spark-connect/src/functions.rs
index 3020388..f2d972b 100644
--- a/crates/spark-connect/src/functions.rs
+++ b/crates/spark-connect/src/functions.rs
@@ -1047,7 +1047,13 @@ pub fn kurtosis(col1: Column) -> Column {
/// Mirrors `pyspark.sql.functions.lag`.
pub fn lag<C: Into<Column>>(cols: impl IntoIterator<Item = C>) -> Column {
let cols: Vec<Column> = cols.into_iter().map(Into::into).collect();
- func("lag", cols.iter().map(|c| c.expression().clone()).collect())
+ let mut args: Vec<Expression> = cols.iter().map(|c| c.expression().clone()).collect();
+ // PySpark's lag(col) defaults the offset to 1 (lag(col, 1)); append it only for the
+ // bare single-column form -- callers passing offset/default already include them.
+ if args.len() == 1 {
+ args.push(lit_int(1));
+ }
+ func("lag", args)
}
/// Mirrors `pyspark.sql.functions.last`.
@@ -1073,10 +1079,13 @@ pub fn lcase(col1: Column) -> Column {
/// Mirrors `pyspark.sql.functions.lead`.
pub fn lead<C: Into<Column>>(cols: impl IntoIterator<Item = C>) -> Column {
let cols: Vec<Column> = cols.into_iter().map(Into::into).collect();
- func(
- "lead",
- cols.iter().map(|c| c.expression().clone()).collect(),
- )
+ let mut args: Vec<Expression> = cols.iter().map(|c| c.expression().clone()).collect();
+ // PySpark's lead(col) defaults the offset to 1; append it only for the bare
+ // single-column form -- callers passing offset/default already include them.
+ if args.len() == 1 {
+ args.push(lit_int(1));
+ }
+ func("lead", args)
}
/// Mirrors `pyspark.sql.functions.length`.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org