2017-02-11 54 views
0

假設有一個日期欄等代表數月的int列一個數據幀:添加月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創建一個結束日期列的方式沒有將日期列轉換回字符串?

所以基本上相同ADD_MONTHS功能

def add_months(startDate: Column, numMonths: Int) 

但經過一列,而不是文字。

回答

1

您可以使用UDF (User Defined Functions)來實現此目的。下面我已創建myUDF函數月加入日期和返回字符串格式的結果日期,我將使用這個UDF來創建新列通過使用withColumnDataFrame

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