2017-06-05 6 views
3

J'ai un dataframe df de columns("id", "current_date", "days") et je suis en train d'ajouter le la « days » à « current_date » et créer une nouvelle dataframe avec le nouveau column appelé "new_date" en utilisant la fonction scala étincelle date_add()Ajouter Nombre de jours colonne Date de colonne dans la même dataframe Spark Scala App

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

Mais ressemble à la fonction date_add accepte que Int valeurs et non columns. Comment peut-on obtenir la sortie désirée dans un tel cas? Y a-t-il d'autres fonctions que je peux utiliser pour obtenir la sortie désirée?

version étincelle: 1.6.0 version scala: 2.10.6

Répondre

3

Une petite coutume udf peut être utilisé pour faire de cette arithmétique possible.

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) 
}) 

Utilisation:

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

Merci. Cette solution a parfaitement fonctionné pour moi. – qubiter

5

Pas besoin d'utiliser une UDF, vous pouvez le faire en utilisant une expression SQL:

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

vous pouvez même passer 'expr' et utiliser directement (dans l'étincelle 2.1+) ' val newDF = df.withColumn ("new_date", date_add ($ "current_date", jours)) ' –