2017-06-05 46 views
3

我有DF的dataframecolumns("id", "current_date", "days"),我嘗試添加了「days」爲「current_date」,並創建一個新的dataframecolumn稱爲「new_date」使用火花階功能date_add()在同一個數據幀到日期列日列的添加號星火斯卡拉應用

val newDF = df.withColumn("new_Date", date_add(df("current_date"), df("days").cast("Int"))) 

不過貌似功能date_add只接受Int值,而不是columns。在這種情況下如何獲得所需的輸出?有什麼替代功能我可以用來獲得所需的輸出?

火花版本:1.6.0 斯卡拉版本:2.10.6

回答

3

一個小的定製可以使用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) 
}) 

使用

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| 
+---+------------+----+----------+ 
+0

謝謝。這個解決方案對我來說很完美。 – qubiter

5

無需使用UDF,您可以使用SQL表達式做到這一點:

val newDF = df.withColumn("new_date", expr("date_add(current_date,days)")) 
+0

你甚至可以跳過'expr'並直接使用(在spark 2.1+中) 'val newDF = df.withColumn(「new_date」,date_add($「current_date」,days))' –

相關問題