为啥 spark-xml 会因 NoSuchMethodError 与 Spark 2.0.0 依赖关系而失败?

Posted

技术标签:

【中文标题】为啥 spark-xml 会因 NoSuchMethodError 与 Spark 2.0.0 依赖关系而失败?【英文标题】:Why does spark-xml fail with NoSuchMethodError with Spark 2.0.0 dependency?为什么 spark-xml 会因 NoSuchMethodError 与 Spark 2.0.0 依赖关系而失败? 【发布时间】:2017-10-11 12:47:15 【问题描述】:

嗨,我是 Scala 和 Intellij 的菜鸟,我只是想在 Scala 上做到这一点:

import org.apache.spark
import org.apache.spark.sql.SQLContext
import com.databricks.spark.xml.XmlReader


object SparkSample 
  def main(args: Array[String]): Unit = 
    val conf = new spark.SparkConf()
    conf.setAppName("Datasets Test")
    conf.setMaster("local[2]")
    val sc = new spark.SparkContext(conf)

    val sqlContext = new SQLContext(sc)
    val df = sqlContext.read
      .format("com.databricks.spark.xml")
      .option("rowTag", "shop")
      .load("shops.xml") /* NoSuchMethod error here */

    val selectedData = df.select("author", "_id")
  df.show

基本上我正在尝试将 XML 转换为 spark 数据框 我在 '.load("shops.xml")' 中收到 NoSuchMethod 错误 下面是SBT

version := "0.1"

scalaVersion := "2.11.3"
val sparkVersion = "2.0.0" 
val sparkXMLVersion = "0.3.3"

libraryDependencies ++= Seq(
  "org.apache.spark"      %%  "spark-core"      %   sparkVersion  exclude("jline", "2.12"),
  "org.apache.spark"      %% "spark-sql"        % sparkVersion excludeAll(ExclusionRule(organization = "jline"),ExclusionRule("name","2.12")),
   "com.databricks"        %% "spark-xml"        % sparkXMLVersion,
)

下面是轨迹:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.sql.types.DecimalType$.Unlimited()Lorg/apache/spark/sql/types/DecimalType;
at com.databricks.spark.xml.util.InferSchema$.<init>(InferSchema.scala:50)
at com.databricks.spark.xml.util.InferSchema$.<clinit>(InferSchema.scala)
at com.databricks.spark.xml.XmlRelation$$anonfun$1.apply(XmlRelation.scala:46)
at com.databricks.spark.xml.XmlRelation$$anonfun$1.apply(XmlRelation.scala:46)
at scala.Option.getOrElse(Option.scala:120)
at com.databricks.spark.xml.XmlRelation.<init>(XmlRelation.scala:45)
at com.databricks.spark.xml.DefaultSource.createRelation(DefaultSource.scala:66)
at com.databricks.spark.xml.DefaultSource.createRelation(DefaultSource.scala:44)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:315)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:149)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:132)

有人能指出错误吗?对我来说似乎是一个依赖问题。 spark-core 似乎工作正常但不是 spark-sql 我之前有 scala 2.12,但由于 spark-core 未解决而更改为 2.11

【问题讨论】:

error: object xml is not a member of package com.databricks.spark的可能重复 【参考方案1】:

tl;dr 我认为这是 Scala 版本不匹配的问题。使用 spark-xml 0.4.1

引用 spark-xml 的 Requirements(突出显示我的):

这个库需要 Spark 2.0+ for 0.4.x.

对于适用于 Spark 1.x 的版本,请检查 branch-0.3

这表明 spark-xml 0.3.3 可以与 Spark 1.x(不是您要求的 Spark 2.0.0)一起使用。

【讨论】:

以上是关于为啥 spark-xml 会因 NoSuchMethodError 与 Spark 2.0.0 依赖关系而失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥标量值函数会因空参数而失败?

为啥这个应用程序会因运行时错误而崩溃?

套接字:为啥阻塞 read() 会因 ENOTCONN 而失败?

SimpleXMLConverter 和改造 2.30。为啥序列化会因 ValueRequiredException 而崩溃?

为啥 TextOutW() 会因自定义字体大于 131 像素而失败?

为啥我的 Gradle 构建会因退出代码 137 而死?