@@ -19,10 +19,10 @@ package org.apache.spark.sql.catalyst.expressions.codegen
1919
2020import scala .collection .mutable
2121import scala .collection .mutable .ArrayBuffer
22- import scala .language .existentials
2322
2423import com .google .common .cache .{CacheBuilder , CacheLoader }
2524import org .codehaus .janino .ClassBodyEvaluator
25+ import scala .language .existentials
2626
2727import org .apache .spark .internal .Logging
2828import org .apache .spark .sql .catalyst .InternalRow
@@ -31,7 +31,7 @@ import org.apache.spark.sql.catalyst.util.{ArrayData, MapData}
3131import org .apache .spark .sql .types ._
3232import org .apache .spark .unsafe .Platform
3333import org .apache .spark .unsafe .types ._
34- import org .apache .spark .util .Utils
34+ import org .apache .spark .util .{ ParentClassLoader , Utils }
3535
3636/**
3737 * Java source for evaluating an [[Expression ]] given a [[InternalRow ]] of input.
@@ -806,7 +806,17 @@ object CodeGenerator extends Logging {
806806 */
807807 private [this ] def doCompile (code : CodeAndComment ): GeneratedClass = {
808808 val evaluator = new ClassBodyEvaluator ()
809- evaluator.setParentClassLoader(Utils .getContextOrSparkClassLoader)
809+
810+ // A special classloader used to wrap the actual parent classloader of
811+ // [[org.codehaus.janino.ClassBodyEvaluator]] (see CodeGenerator.doCompile). This classloader
812+ // does not throw a ClassNotFoundException with a cause set (i.e. exception.getCause returns
813+ // a null). This classloader is needed because janino will throw the exception directly if
814+ // the parent classloader throws a ClassNotFoundException with cause set instead of trying to
815+ // find other possible classes (see org.codehaus.janinoClassLoaderIClassLoader's
816+ // findIClass method). Please also see https://issues.apache.org/jira/browse/SPARK-15622 and
817+ // https://issues.apache.org/jira/browse/SPARK-11636.
818+ val parentClassLoader = new ParentClassLoader (Utils .getContextOrSparkClassLoader)
819+ evaluator.setParentClassLoader(parentClassLoader)
810820 // Cannot be under package codegen, or fail with java.lang.InstantiationException
811821 evaluator.setClassName(" org.apache.spark.sql.catalyst.expressions.GeneratedClass" )
812822 evaluator.setDefaultImports(Array (
0 commit comments