我有一个scala函数,计算两个LocalDateTime
作为参数的两个日期之间的差异:
我在DataFrame的2个字段中应用了该函数。
似乎添加了新列,因为我的数据框包含7 fields
,并且在应用函数toEquals后显示8 fields
。
但当我这样做时:dfWithToEquals.printSchema()
它显示以下错误:
有人可以帮助我如何解决此错误以显示包含这两个日期之间差异的新列?
答案 0 :(得分:1)
input_table.withColumn
会返回一个新的DataFrame。所以,要显示它:
val dfWithToEquals = input_table.withColumn("toEquals", toEquals($"start_date",$"finish_date"))
dfWithToEquals.printSchema()
dfWithToEquals.show()
更新
解决Task not serializable
异常:传递给Spark的对象必须是可序列化的。这里DATE_TIME_FORMATTER
引用是在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
})
结束更新