HiveUDF + saxon 9.1.0.8 + Java8 = 未能创建 XPathFactory

HiveUDF + saxon 9.1.0.8 + Java8 = failed to create an XPathFactory

我的 Spark 作业与 HiveContext 和 Saxon 一起工作正常,除非代码中没有定义 UDF。在 UDF 实现的情况下 - HiveContext 初始化失败并出现错误。我听说在 saxon 9.5.1.5 中解决了 saxon\java8 不兼容问题,它尚未在中央 Maven 存储库中作为免费版本发布:

Caused by: java.lang.RuntimeException: XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: java.util.ServiceConfigurationError: javax.xml.xpath.XPathFactory: jar:file:/JBOD_D19/hadoop/cdh/yarn/nm/usercache/u23120d1/appcache/application_1477998759081_5017/container_e45_1477998759081_5017_01_000001/saxon-xpath-9.1.0.8.jar!/META-INF/services/javax.xml.xpath.XPathFactory:2: Illegal configuration-file syntax at javax.xml.xpath.XPathFactory.newInstance(XPathFactory.java:102) at org.apache.hadoop.hive.ql.udf.xml.UDFXPathUtil.(UDFXPathUtil.java:41) at org.apache.hadoop.hive.ql.udf.xml.GenericUDFXPath.(GenericUDFXPath.java:53)

正确,在类路径上使用 Java8 中的 XPathFactory.newInstance() 方法和旧版本的 Saxon 将导致此失败。所以使用更新版本的 Saxon。当前版本是 9.7.0.11。

可以在 Maven 中找到 Saxon 的最新版本。多年来,我们一直拒绝将 Saxon 放入 Maven,因为从 Maven 下载不满足我们使用的某些第三方软件组件的条件,即您不得在不分发法律条款和条件的情况下分发 JAR 文件。尽管通过 Maven 分发仍然违反了这一条件,但由于需求巨大,我们最终让步了。关心这些事情的组织不应该使用 Maven。