diff --git a/sql/hive-thriftserver/src/test/resources/data/files/hive-hcatalog-core-0.13.1.jar b/sql/hive-thriftserver/src/test/resources/data/files/hive-hcatalog-core-0.13.1.jar new file mode 100644 index 000000000000..37af9aafad8a Binary files /dev/null and b/sql/hive-thriftserver/src/test/resources/data/files/hive-hcatalog-core-0.13.1.jar differ diff --git a/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/CliSuite.scala b/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/CliSuite.scala index b070fa8eaa46..b41218426fb9 100644 --- a/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/CliSuite.scala +++ b/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/CliSuite.scala @@ -151,4 +151,20 @@ class CliSuite extends FunSuite with BeforeAndAfter with Logging { -> "hive_test" ) } + + test("Single command with --jars") { + val jarFile = + Thread.currentThread().getContextClassLoader + .getResource("data/files/hive-hcatalog-core-0.13.1.jar") + runCliWithin(1.minute, + Seq( + "--jars", + s"$jarFile", + "-e", + """CREATE TABLE t1(a string, b string) ROW FORMAT + | SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';""".stripMargin))( + "" + -> "OK" + ) + } } diff --git a/sql/hive/src/main/scala/org/apache/spark/sql/hive/TableReader.scala b/sql/hive/src/main/scala/org/apache/spark/sql/hive/TableReader.scala index 0b6f7a334a71..294fc3bd7d5e 100644 --- a/sql/hive/src/main/scala/org/apache/spark/sql/hive/TableReader.scala +++ b/sql/hive/src/main/scala/org/apache/spark/sql/hive/TableReader.scala @@ -79,7 +79,7 @@ class HadoopTableReader( makeRDDForTable( hiveTable, Class.forName( - relation.tableDesc.getSerdeClassName, true, Utils.getSparkClassLoader) + relation.tableDesc.getSerdeClassName, true, Utils.getContextOrSparkClassLoader) .asInstanceOf[Class[Deserializer]], filterOpt = None) diff --git a/sql/hive/src/main/scala/org/apache/spark/sql/hive/client/IsolatedClientLoader.scala b/sql/hive/src/main/scala/org/apache/spark/sql/hive/client/IsolatedClientLoader.scala index 196a3d836cab..e957588971ec 100644 --- a/sql/hive/src/main/scala/org/apache/spark/sql/hive/client/IsolatedClientLoader.scala +++ b/sql/hive/src/main/scala/org/apache/spark/sql/hive/client/IsolatedClientLoader.scala @@ -124,6 +124,8 @@ private[hive] class IsolatedClientLoader( name.startsWith("com.google") || name.startsWith("java.lang.") || name.startsWith("java.net") || + name.startsWith("org.apache.hadoop.conf") || + name.startsWith("org.apache.hadoop.hive.serde") || // TODO keep adding? sharedPrefixes.exists(name.startsWith) /** True if `name` refers to a spark class that must see specific version of Hive. */ @@ -150,7 +152,9 @@ private[hive] class IsolatedClientLoader( defineClass(name, bytes, 0, bytes.length) } else if (!isSharedClass(name)) { logDebug(s"hive class: $name - ${getResource(classToPath(name))}") - super.loadClass(name, resolve) + try super.loadClass(name, resolve) catch { + case _: ClassNotFoundException => baseClassLoader.loadClass(name) + } } else { logDebug(s"shared class: $name") baseClassLoader.loadClass(name)