[ 
https://issues.apache.org/jira/browse/SPARK-45171?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Hyukjin Kwon reassigned SPARK-45171:
------------------------------------

    Assignee: Bruce Robbins

> GenerateExec fails to initialize non-deterministic expressions before use
> -------------------------------------------------------------------------
>
>                 Key: SPARK-45171
>                 URL: https://issues.apache.org/jira/browse/SPARK-45171
>             Project: Spark
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 3.5.0
>            Reporter: Bruce Robbins
>            Assignee: Bruce Robbins
>            Priority: Major
>              Labels: pull-request-available
>
> The following query fails:
> {noformat}
> select *
> from explode(
>   transform(sequence(0, cast(rand()*1000 as int) + 1), x -> x * 22)
> );
> {noformat}
> The error is:
> {noformat}
> 23/09/14 09:27:25 ERROR Executor: Exception in task 0.0 in stage 3.0 (TID 3)
> java.lang.IllegalArgumentException: requirement failed: Nondeterministic 
> expression org.apache.spark.sql.catalyst.expressions.Rand should be 
> initialized before eval.
>       at scala.Predef$.require(Predef.scala:281)
>       at 
> org.apache.spark.sql.catalyst.expressions.Nondeterministic.eval(Expression.scala:497)
>       at 
> org.apache.spark.sql.catalyst.expressions.Nondeterministic.eval$(Expression.scala:495)
>       at 
> org.apache.spark.sql.catalyst.expressions.RDG.eval(randomExpressions.scala:35)
>       at 
> org.apache.spark.sql.catalyst.expressions.BinaryArithmetic.eval(arithmetic.scala:384)
>       at 
> org.apache.spark.sql.catalyst.expressions.UnaryExpression.eval(Expression.scala:543)
>       at 
> org.apache.spark.sql.catalyst.expressions.BinaryArithmetic.eval(arithmetic.scala:384)
>       at 
> org.apache.spark.sql.catalyst.expressions.Sequence.eval(collectionOperations.scala:3062)
>       at 
> org.apache.spark.sql.catalyst.expressions.SimpleHigherOrderFunction.eval(higherOrderFunctions.scala:275)
>       at 
> org.apache.spark.sql.catalyst.expressions.SimpleHigherOrderFunction.eval$(higherOrderFunctions.scala:274)
>       at 
> org.apache.spark.sql.catalyst.expressions.ArrayTransform.eval(higherOrderFunctions.scala:308)
>       at 
> org.apache.spark.sql.catalyst.expressions.ExplodeBase.eval(generators.scala:375)
>       at 
> org.apache.spark.sql.execution.GenerateExec.$anonfun$doExecute$8(GenerateExec.scala:108)
> ...        
> {noformat}
> However, this query succeeds:
> {noformat}
> select *
> from explode(
>   sequence(0, cast(rand()*1000 as int) + 1)
> );
> {noformat}
> The difference is that {{transform}} turns off whole-stage codegen, which 
> exposes a bug in {{GenerateExec}} where the non-deterministic expression 
> passed to the generator function is not initialized before being used.
> An even simpler reprod case is:
> {noformat}
> set spark.sql.codegen.wholeStage=false;
> select explode(array(rand()));
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to