2017-02-11 8 views
0

を月の追加:日付列と月数を表す整数列を有するデータフレームを仮定すると、列の値に基づいてDATETYPEに

val df = Seq(("2011-11-11",1),("2010-11-11",3),("2012-11-11",5)) 
       .toDF("startDate","monthsToAdd") 
       .withColumn("startDate",'startDate.cast(DateType)) 

+----------+-----------+ 
| startDate|monthsToAdd| 
+----------+-----------+ 
|2011-11-11|   1| 
|2010-11-11|   3| 
|2012-11-11|   5| 
+----------+-----------+ 

はたstartDateに数ヶ月を添加することによりendDateに列を作成する方法があります日付列を文字列に戻すことなく?

ADD_MONTHSように基本的に同じで

def add_months(startDate: Column, numMonths: Int) 

機能ではなく、リテラルのカラムを通過させます。

答えて

1

あなたはこれを達成するためにUDF (User Defined Functions)を使用することができます。私は、これまでに数ヶ月を追加myUDF関数を作成しており、文字列の形式での結果の日付を返し、私は上のwithColumnを使用して新しい列を作成するには、このUDFを使用して下記DataFrame

import java.text.SimpleDateFormat 
import java.util.Calendar 
import javax.xml.bind.DatatypeConverter 

import org.apache.spark.sql.functions._ 
import sparkSession.sqlContext.implicits._ 

val df = Seq(("2011-11-11",1),("2010-11-11",3),("2012-11-11",5)).toDF("startDate","monthsToAdd") 

val myUDF = udf { 
    val simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd") 
    (startDate: String, monthValue: Int) => { 
    val calendar = DatatypeConverter.parseDateTime(startDate) 
    calendar.add(Calendar.MONTH, monthValue) 
    simpleDateFormat.format(calendar.getTime) 
    } 
} 

val newDf = df.withColumn("endDate", myUDF(df("startDate"), df("monthsToAdd"))) 
newDf.show() 

出力:

+----------+-----------+----------+ 
| startDate|monthsToAdd| endDate| 
+----------+-----------+----------+ 
|2011-11-11|   1|2011-12-11| 
|2010-11-11|   3|2011-02-11| 
|2012-11-11|   5|2013-04-11| 
+----------+-----------+----------+ 
関連する問題