在Spark Scala应用程序的同一数据框中,将日期列添加到日期列

bel*_*lls 6 scala dateadd dataframe apache-spark

我有一个dataframedf,columns ("id", "current_date", "days")我正在尝试将" days" 添加到" current_date"并使用spark scala函数创建一个dataframe新的column名为" new_date"的新函数date_add()

val newDF = df.withColumn("new_Date", date_add(df("current_date"), df("days").cast("Int")))
Run Code Online (Sandbox Code Playgroud)

但看起来该函数date_add只接受Int值而不接受columns.在这种情况下如何获得所需的输出?我可以使用任何替代功能来获得所需的输出吗?

spark版本:1.6.0 scala版本:2.10.6

Rap*_*oth 12

无需使用UDF,您可以使用SQL表达式执行此操作:

val newDF = df.withColumn("new_date", expr("date_add(current_date,days)"))
Run Code Online (Sandbox Code Playgroud)


rog*_*one 5

一个小的自定义 udf 可用于使此日期算术成为可能。

import org.apache.spark.sql.functions.udf
import java.util.concurrent.TimeUnit
import java.util.Date
import java.text.SimpleDateFormat    

val date_add = udf((x: String, y: Int) => {
    val sdf = new SimpleDateFormat("yyyy-MM-dd")
    val result = new Date(sdf.parse(x).getTime() + TimeUnit.DAYS.toMillis(y))
  sdf.format(result)
} )
Run Code Online (Sandbox Code Playgroud)

用法

scala> val df = Seq((1, "2017-01-01", 10), (2, "2017-01-01", 20)).toDF("id", "current_date", "days")
df: org.apache.spark.sql.DataFrame = [id: int, current_date: string, days: int]

scala> df.withColumn("new_Date", date_add($"current_date", $"days")).show()
+---+------------+----+----------+
| id|current_date|days|  new_Date|
+---+------------+----+----------+
|  1|  2017-01-01|  10|2017-01-11|
|  2|  2017-01-01|  20|2017-01-21|
+---+------------+----+----------+
Run Code Online (Sandbox Code Playgroud)