【问题标题】:WithColumn: display a new column dateTimeWithColumn:显示一个新的列dateTime
【发布时间】:2018-04-05 08:56:05
【问题描述】:

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

我在我的 DataFrame 的 2 个字段上应用了该函数。

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

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

【问题讨论】:

    标签: scala datetime user-defined-functions


    【解决方案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
    })
    

    更新结束

    【讨论】:

    • scala> val DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") with Serializable:1: error: ';'预期但找到“与”。 val DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") with Serializable ^ scala> val DATE_TIME_FORMATTER = new DateTimeFormatter("yyyy-MM-dd HH:mm:ss") with Serializable : 124:错误:从最终类 DateTimeFormatter val DATE_TIME_FORMATTER = new DateTimeFormatter("yyyy-MM-dd HH:mm:ss") 与 Serializable 非法继承
    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2012-09-03
    • 2020-02-20
    • 2018-08-02
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多