Scala Spark 中的 udf 运行时错误

Posted

技术标签:

【中文标题】Scala Spark 中的 udf 运行时错误【英文标题】:Runtime error with udf in Scala Spark 【发布时间】:2017-06-12 21:50:43 【问题描述】:

我正在尝试在 DataFrame 中创建一个新列。这个新列将包含从 Long 时间戳创建的格式化数据字符串(以毫秒为单位)。

我不断收到此错误:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.sql.DataFrameReader.jdbc(Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;)Lorg/apache/spark/sql/Dataset;

出现在这段代码中:

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.sql.DataFrame, SQLContext
import joptsimple.OptionParser
import org.apache.spark.sql.functions._
import java.text.SimpleDateFormat

import org.apache.spark.sql.functions.udf
    .
    .
    .
    val formatDateUDF = udf((ts: Long) => 
      new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(ts)
    )

我在 build.sbt 中使用了以下依赖项:

scalaVersion := "2.11.11"

libraryDependencies ++= Seq(
  // Spark dependencies
  "org.apache.spark" % "spark-hive_2.11" % "2.1.1" % "provided",
  "org.apache.spark" % "spark-mllib_2.11" % "2.1.1" % "provided",
  // Third-party libraries
  "postgresql" % "postgresql" % "9.1-901-1.jdbc4",
  "net.sf.jopt-simple" % "jopt-simple" % "5.0.3",
  "org.scalactic" %% "scalactic" % "3.0.1",
  "org.scalatest" %% "scalatest" % "3.0.1" % "test",
  "joda-time" % "joda-time" % "2.9.9"
)

我愿意接受其他可能更容易(或者至少可以工作)的方法。

【问题讨论】:

为什么不使用 unix_timestamp 而不是 UDF? 错误似乎不在 udf 中,而是在您从 jdbc 读取数据并转换为数据集的地方。因此,请同时使用阅读部分更新您的问题。 【参考方案1】:

我认为from_unixtime 方法应该更有效?

val input = List(
  ("a",1497348453L),
  ("b",1497345453L),
  ("c",1497341453L),
  ("d",1497340453L)
).toDF("name", "timestamp")


input.select(
  'name,
  from_unixtime('timestamp, "yyyy.MM.dd.HH.mm.ss").alias("timestamp_formatted")
).show()

输出:

+----+-------------------+
|name|timestamp_formatted|
+----+-------------------+
|   a|2017.06.13.12.07.33|
|   b|2017.06.13.11.17.33|
|   c|2017.06.13.10.10.53|
|   d|2017.06.13.09.54.13|
+----+-------------------+

【讨论】:

我得到至少一个错误:[错误] /Users/paulreiners/dev/tv-insight-spark-scala/top-20-ocean-ports/src/main/scala/com/transvoyant /insight/ocean/Top20Ports.scala:96:类型不匹配; [错误] 发现:符号 [错误] 必需:org.apache.spark.sql.Column [错误] from_unixtime('timestamp, "yyyy.MM.dd.HH.mm.ss").alias("timestamp_formatted") [ error] ^ [error] 发现一个错误 你能分享一下确切的代码吗?也许忘了import spark.implicits._ 或者你的专栏不叫timestamp?检查gist.github.com/TomLous/ae2c14633ab1df4349eb7595c988e84b

以上是关于Scala Spark 中的 udf 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scala 从 Spark 的 withColumn 中调用 udf 时出错

模式匹配范围在Scala与Spark udf

如果其他,Spark scala udf 错误

spark read 在 Scala UDF 函数中不起作用

Scala 和 Spark UDF 函数

Scala中的Spark分组映射UDF