Implement Spark-compatible `log1p`
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 80/100
Direzione di ricerca
Inizia leggendo crates/spark/src/function/math/expm1.rs per il pattern Signature::exact(vec![Float64]), l’annotazione #[user_doc] e la gestione dei null, poi registra la nuova funzione allo stesso modo. Implementa ln_1p e mappa qualsiasi input <= -1.0 su NULL, in modo coerente con UnaryLogExpression di Spark. Abilita ed estendi le query segnaposto in crates/sqllogictest/test_files/math/log1p.slt, quindi esegui quel file slt. Fatto significa che i casi slt per NULL, -1.0, -Infinity, NaN, Infinity, -0.0 e valori minuscoli passano e i risultati corrispondono a StrictMath.log1p.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Part of #174 and apache/datafusion-comet#7300.
What the function does
log1p(expr) returns ln(1 + expr), computed accurately for expr near 0. The argument is implicitly cast to DOUBLE (UnaryMathExpression, inputTypes = Seq(DoubleType)) and the result is DOUBLE. Like the other Hive-derived log functions (UnaryLogExpression), any input <= -1.0 returns NULL instead of -Infinity or NaN. The result is always nullable. Available since 1.4.0.
Spark evaluates java.lang.StrictMath.log1p (fdlibm) in both the interpreted and code-generated paths.
Examples
SELECT log1p(0);
-- 0.0
SELECT log1p(-1);
-- NULL
SELECT log1p(-2);
-- NULL
SELECT log1p(CAST('NaN' AS DOUBLE));
-- NaN
SELECT log1p(CAST('Infinity' AS DOUBLE));
-- Infinity
MathExpressionsSuite checks log1p against StrictMath.log1p for 0.0, 0.1, ..., 2.0 and expects NULL for -10.0, -9.0, ..., -1.0.
Edge cases to test
- NULL input.
- Exactly -1.0 returns NULL (the boundary is
<= yAsymptotewithyAsymptote = -1.0), and values just above it (e.g.-0.9999999999999999) return a large negative finite value. - Values below -1 (including
-Infinity) return NULL, not NaN. - NaN returns NaN (
NaN <= -1.0is false).+InfinityreturnsInfinity. -0.0returns-0.0and0.0returns0.0(check the sign).- Tiny values (
1e-300,1e-20) return the input value, which is whereln(1 + x)would lose precision. - Bit-exact results: Spark uses fdlibm via
StrictMath. Rust'sf64::ln_1pcalls the platformlog1p, which can differ in the last ulp on some inputs and platforms. Compare againstStrictMath.log1pvalues for a range of inputs (e.g. 0.1 to 2.0 and large values like1e300), or use a port of fdlibms_log1p.cif they differ. - Integer, DECIMAL, FLOAT and STRING arguments (cast to DOUBLE first; with ANSI on an invalid string fails in the cast).
Differences across Spark versions
None found (3.4 through 4.2; only contextIndependentFoldable was added).
Implementation notes
- Spark:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala,Log1p, base classesUnaryLogExpressionandUnaryMathExpression. - DataFusion core has no
log1p(it hasln,log,log2,log10). - Follow
crates/spark/src/function/math/expm1.rs(Signature::exact(vec![Float64]),exp_m1), usingln_1pand mappingx <= -1.0to NULL. - Tests: the placeholder
crates/sqllogictest/test_files/math/log1p.sltexists with a commented-out query; enable and extend it. Document with#[user_doc].
This issue was generated by an LLM (Claude) from the Apache Spark source code and tests. Examples come from Spark's ExpressionDescription examples, test suites and .sql.out golden files, but please verify them against Spark before relying on them.
- Lingua principale
- Rust
- Stelle
- 7
- Fork
- 15
- Merge medio
- 16h 43m
- PR unite (30g)
- 26
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/datafusion-spark
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
apache/datafusion-spark#287 ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug] make_dt_interval returns NULL for more than about 1.49 million days, Spark returns the intervalForse già presa @Subodh-17 l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
apache/datafusion-spark#109 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 18/100
apache/datafusion-spark#299 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
apache/datafusion-spark#298 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
apache/datafusion-spark#297 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di apache/datafusion-spark
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
storytold/photocraft#15232 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
suhina-daw/suhina-daw#1477 ·
I maintainer di solito rispondono entro 1 giorno
-
parity priority: low ui
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
storytold/pdfcraft#7483 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
IngvarConsulting/unica#3097 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement in-progress
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 64/100