UDF:在Dataframe scala上应用函数

时间:2018-04-04 13:28:26

标签: scala datetime user-defined-functions

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

我有一个包含两个字段start_date和finish_date的dataFrame。

我希望construst UDF“可能”在我的数据帧上应用函数toEquals,特别是在é字段start_datefinish_date上计算它们之间的差异。但start_date和finish_date的类型是String。

1 个答案:

答案 0 :(得分:1)

我还没有测试过代码,但toEquals函数中使用udf逻辑应该足够了

import org.apache.spark.sql.functions.udf
def toEquals = udf((rd1: String, rd2: String) => {
  val d1 = adjust(LocalDateTime.parse(rd1, DATE_TIME_FORMATTER))
  val d2 = adjust(LocalDateTime.parse(rd2, DATE_TIME_FORMATTER), asc = false)     
  if (d1.isAfter(d2)) 0.hours.toString
  else if (d1.toLocalDate.isEqual(d2.toLocalDate)) {
    (toEnd(d1.toLocalTime) - toEnd(d2.toLocalTime)).toString
  }
  else {
    (toEnd(d1.toLocalTime) + jourOuvree(d1.toLocalDate.plusDays(1), d2.toLocalDate.minusDays(1)) * 8.hours + toStart(d2.toLocalTime)).toString
  }
})

您可以将udf功能称为

input_table.withColumn("toEquals", toEquals($"start_date",$"finish_date"))