我在某些必须很简单的事情上遇到了麻烦。但是我仍处于学习的早期阶段。
问题是:我想获取一个项目的开始日期,然后再添加20天。我想以自动化方式进行操作,而不是手动添加(例如。尽管我知道它开始于2019-06-01,但我不想手动输入日期“ 2019-06-21”,因为我可能会更改它以后,我想这样做是我的懒惰。)
所以,要确定我的开始日期:
val start_date = table.select(date_trunc("day", min('applied_at)).as("start_date"))
哪个要返回
start_date: org.apache.spark.sql.DataFrame = [start_date: timestamp]
但是,如果我尝试在date_add()函数上使用它,则会收到错误消息。
val objective = date_add(start_date, 20)
error: type mismatch;
found : org.apache.spark.sql.DataFrame
(which expands to) org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]
required: org.apache.spark.sql.Column
&& date_trunc("day",$"applied_at").as("applied_at") < date_add(start_date, projection_proxy)
^
因此,我尝试了其他格式并进行了一些尝试,但我自己找不到答案。一定是因为我没有必要的基本知识。
我得到的是问我一个列,但是我可以将变量转换成列吗?我是否应该以其他方式解决这个问题?
答案 0 :(得分:0)
由于错误提示date_add
函数接受col
数据类型,但是您正尝试传递整个Dataframe。
在现有select
上应用dataframe
时,无论其具有多少列或行,都会得到一个new dataframe
。
要添加日期到日期列
df = start_date.withColumn("new_date", date_add($"start_date", 20))
如果您只想显示一列,或者只想显示具有新日期的列
val newDateDF = minDateDF.
withColumn("new_date", date_add($"start_date", 1))
.drop($"start_date")
.select($"new_date".alias("start_date"))
如果您想将其作为值
val new_date = newDateDF.select($"start_date").collect()(0)(0).toString()