Max Gekk created SPARK-60048:
--------------------------------

             Summary: Remember a whole-stage codegen split decision by a key 
that ignores literal values
                 Key: SPARK-60048
                 URL: https://issues.apache.org/jira/browse/SPARK-60048
             Project: Spark
          Issue Type: Improvement
          Components: SQL
    Affects Versions: 5.0.0
            Reporter: Max Gekk


Whole-stage codegen can split the expressions of a stage that has a method past 
the JIT limit (SPARK-33301, https://github.com/apache/spark/pull/59225). It 
decides by generating the stage's code in one piece, compiling it as a trial, 
and generating it again with some expressions split. The decision is remembered 
by WholeStageCodegenExec.decisionKey, a digest of the generated code with the 
class loader, the compiler, the method limit and methodSplitThreshold, so that 
executing a query again skips the trial compiles.

A literal that changes on every run changes that digest on every run. 
ComputeCurrentTime turns current_timestamp() into a literal and 
Literal.doGenCode writes it into the source, so a stage holding one decides 
afresh each run and pays two code generations and two compiles where master 
pays one of each. Queries without such literals compile nothing new after the 
first execution.

Proposed: remember the decision by a key that ignores literal values, either 
the code digested with numeric literals masked, or the plan with literals 
normalized plus every conf that affects code generation.

Care is needed: a literal's value moves a method's bytecode size by a byte or 
two, which can matter for a method near the limit, and a key built from the 
plan has to carry all the codegen confs. Tests: two executions of a query with 
current_timestamp() decide once; a decision is not reused under a different 
conf that changes the code.




--
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