在对象内部定义的 Apache-Spark UDF 会引发"No TypeTag available for String"



>在交互式会话期间复制粘贴函数与使用 sbt 编译相比,我得到了不同的行为。

交互式会话的最小、完整和可验证示例

$ sbt package 
[error] src/main/scala/xxyy.scala:6: No TypeTag available for String
[error]     val correctDiacritics = udf((s: scala.Predef.String) => {
[error]                                ^
[error] two errors found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 9 s, completed May 22, 2018 2:22:52 PM
$ cat src/main/scala/xxyy.scala 
package xxx.yyy
import org.apache.spark.sql.functions.udf
object DummyObject {
val correctDiacritics = udf((s: scala.Predef.String) => {
s.replaceAll("è","e")
.replaceAll("é","e")
.replaceAll("à","a")
.replaceAll("ç","c")
})
}

上述代码无法编译。但是,在交互式会话期间:

// During the `spark-shell` session.
// Entering paste mode (ctrl-D to finish)
import org.apache.spark.sql.functions.udf
object DummyObject {
val correctDiacritics = udf((s: scala.Predef.String) => {
s.replaceAll("è","e")
.replaceAll("é","e")
.replaceAll("à","a")
.replaceAll("ç","c")
})
}
// Exiting paste mode, now interpreting.
// import org.apache.spark.sql.functions.udf
// defined object DummyObject
// Proceeds sucessfully.

版本:

  • 我正在使用Scala 2.11.

  • 我正在使用Spark 2.1.0.

  • built.sbt

    name := "my_app"
    version := "0.0.1"
    scalaVersion := "2.11.12"
    resolvers ++= Seq(
    Resolver sonatypeRepo "public",
    Resolver typesafeRepo "releases"
    )
    resolvers += "MavenRepository" at "https://mvnrepository.com/"
    libraryDependencies ++= Seq(
    // "org.apache.spark" %% "spark-core" % "2.1.0",
    // "org.apache.spark" %% "spark-sql" % "2.1.0",
    //"org.apache.spark" %% "spark-core_2.10" % "1.0.2",
    // "org.apache.spark" %
    "org.apache.spark" % "spark-sql_2.10" % "2.1.0",
    "org.apache.spark" % "spark-core_2.10" % "2.1.0",
    "org.apache.spark" % "spark-mllib_2.10" % "2.1.0"
    )
    

相关问题:

  • udf 没有可用于类型字符串的类型标记。

    • 接受的答案并不能解决问题。
  • Spark,sbt 包 -- 没有可用的 TypeTag。

    • 截至 2018-05-22 没有答案。
  • 没有可用的类型标记 在 scala spark udf 中出错。

    • 截至 2018-05-22 没有答案。
  • Spark UDF 错误没有可用于字符串的类型标记。

    • 截至 2018-05-22 没有答案。

您的构建定义不正确:

  • 使用 Scala 2.11.12 构建项目
  • 但是在 Scala 2.10 中使用 Spark 依赖项构建

由于 Scala 在主要版本之间不兼容二进制,因此会出现错误。

相反,嵌入 Scala 版本最好使用%%

libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-sql" % "2.1.0",
"org.apache.spark" %% "spark-core" % "2.1.0",
"org.apache.spark" %% "spark-mllib" % "2.1.0"
)

否则,请确保使用正确的版本:

libraryDependencies ++= Seq(
"org.apache.spark" % "spark-sql_2.11" % "2.1.0",
"org.apache.spark" % "spark-core_2.11" % "2.1.0",
"org.apache.spark" % "spark-mllib_2.11" % "2.1.0"
)

相关内容

最新更新