Scala WithColumn:显示新列dateTime

Scala WithColumn:显示新列dateTime,scala,datetime,user-defined-functions,Scala,Datetime,User Defined Functions,我有一个scala函数,计算两个日期之间的差值,取两个LocalDateTime作为参数: 我在数据帧的两个字段上应用了该函数 添加新列似乎是因为我的数据框包含7个字段,并且在应用函数toEquals后显示8个字段。 但当我这样做时:dfWithToEquals.printSchema() 它显示以下错误: 有人可以帮助我如何解决此错误,以显示包含这两个日期之间差异的新列?input\u表。withColumn返回一个新的数据帧。因此,要显示它: val dfWithToEquals = inp

我有一个scala函数,计算两个日期之间的差值,取两个
LocalDateTime
作为参数:

我在数据帧的两个字段上应用了该函数

添加新列似乎是因为我的数据框包含
7个字段
,并且在应用函数toEquals后显示
8个字段
。 但当我这样做时:
dfWithToEquals.printSchema()
它显示以下错误:


有人可以帮助我如何解决此错误,以显示包含这两个日期之间差异的新列?

input\u表。withColumn
返回一个新的数据帧。因此,要显示它:

val dfWithToEquals = input_table.withColumn("toEquals", toEquals($"start_date",$"finish_date"))
dfWithToEquals.printSchema()
dfWithToEquals.show()
更新

要解决
任务不可序列化
异常:传递给Spark的对象必须可序列化。此处,
DATE\u TIME\u格式化程序
引用是在
udf
之外创建的,不可序列化。尝试将其实例化移动到函数中:

def toEquals = udf((rd1: String, rd2: String) => {
  val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
  val d1 = adjust(LocalDateTime.parse(rd1, formatter))
  val d2 = adjust(LocalDateTime.parse(rd2, formatter ), asc = false)
  // remaining code unchanged
})

使用可序列化的模式(“yyyy-MM-dd HH:MM:ss”)的更新结束

scala>val-DATE\u-TIME\u-FORMATTER=DateTimeFormatter.of应为,但找到“with”。val DATE\u TIME\u FORMATTER=DateTimeFormatter.of模式(“yyyy-MM-dd HH:MM:ss”),可序列化^scala>val DATE\u TIME\u FORMATTER=new DateTimeFormatter(“yyy-MM-dd HH:MM:ss”)可序列化:124:错误:从可序列化的最终类DateTimeFormatter val DATE_TIME_FORMATTER=新DateTimeFormatter(“yyyy-MM-dd HH:MM:ss”)非法继承