当我尝试使用' months_between'函数查找两个日期之间的月数时,我遇到了一个问题。当我的输入日期格式为' dd / mm / yyyy'或任何其他日期格式,然后该函数返回正确的输出。但是当我将输入日期格式作为yyyymmdd传递时,我得到以下错误。
代码:
val df = spark.read.option("header", "true").option("dateFormat", "yyyyMMdd").option("inferSchema", "true").csv("MyFile.csv")
val filteredMemberDF = df.withColumn("monthsBetween", functions.months_between(col("toDate"), col("fromDT")))
错误:
无法解决' months_between(
toDate
,fromDT
)'由于数据类型不匹配:参数1需要时间戳类型, 然而,'toDate
'属于int类型。参数2需要时间戳类型,然而,'fromDT
'属于int类型。;
当我的输入如下时,
id fromDT toDate
11 16/06/2008 16/08/2008
12 13/07/2008 13/10/2008
获得预期的输出,
id fromDT toDate monthsBetween
11 16/6/2008 16/8/2008 2
12 13/7/2008 13/10/2008 3
当我传递以下数据时,面对上述错误。
id fromDT toDate
11 20150930 20150930
12 20150930 20150930
答案 0 :(得分:0)
首先需要使用to_date
函数将这些数字转换为DateTimes。
import org.apache.spark.sql.functions._
val df = spark.read
.option("header", "true")
.option("dateFormat", "yyyyMMdd")
.option("inferSchema", "true")
.csv("MyFile.csv")
val dfWithDates = df
.withColumn("toDateReal", to_date(concat(col("toDate")), "yyyyMMdd"))
.withColumn("fromDateReal", to_date(concat(col("fromDT")), "yyyyMMdd"))
val filteredMemberDF = dfWithDates
.withColumn("monthsBetween", months_between(col("toDateReal"), col("fromDateReal")))