首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于列值向DateType添加月份

基于列值向DateType添加月份
EN

Stack Overflow用户
提问于 2017-02-11 09:39:43
回答 1查看 638关注 0票数 0

假设一个dataframe有一个日期列,一个Int列代表几个月:

代码语言:javascript
复制
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|
+----------+-----------+

是否有一种方法可以通过将月份添加到endDate中而不将date列转换回string来创建startDate列?

所以与add_months函数基本相同

代码语言:javascript
复制
def add_months(startDate: Column, numMonths: Int)

而是传递一列而不是文字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-11 10:28:22

您可以使用UDF (User Defined Functions)来实现这一点。下面我创建了myUDF函数,它添加月份日期并以字符串格式返回结果日期,我将使用这个UDF创建一个新列,使用withColumn on DataFrame

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
+----------+-----------+----------+
| startDate|monthsToAdd|   endDate|
+----------+-----------+----------+
|2011-11-11|          1|2011-12-11|
|2010-11-11|          3|2011-02-11|
|2012-11-11|          5|2013-04-11|
+----------+-----------+----------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42174392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档